1215787625 发表于 2023-10-25 11:06:11

C语言求助

求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入 复制
9999999999999999999999999999999999999
9999999999999
样例输出 复制
9999999999999999999999990000000000000
请用C语言编写程序

isdkz 发表于 2023-10-25 11:06:19

#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 201

void subtract(char *a, char *b, char *result) {
    int carry = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int diff = len_a - len_b;
   
    for (int i = len_b - 1; i >= 0; i--) {
      int digit_a = a - '0';
      int digit_b = b[ i] - '0';
      int digit_diff = digit_a - digit_b - carry;
      
      if (digit_diff < 0) {
            digit_diff += 10;
            carry = 1;
      } else {
            carry = 0;
      }
      
      result = digit_diff + '0';
    }
   
    for (int i = diff - 1; i >= 0; i--) {
      int digit_a = a[ i] - '0';
      int digit_diff = digit_a - carry;
      
      if (digit_diff < 0) {
            digit_diff += 10;
            carry = 1;
      } else {
            carry = 0;
      }
      
      result[ i] = digit_diff + '0';
    }
   
    result = '\0';
}

int main() {
    char a;
    char b;
    char result;
   
    scanf("%s", a);
    scanf("%s", b);
   
    subtract(a, b, result);
   
    printf("%s\n", result);
   
    return 0;
}

六翻了 发表于 2023-10-26 10:11:14

#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 200

void subtract(char *a, char *b, char *result) {
    int a_len = strlen(a);
    int b_len = strlen(b);
    int result_len = a_len - b_len + 1; // 计算结果长度,加1是为了保证有足够的空间存储结果
    int carry = 0; // 进位标志
    int i, j;

    // 从低位开始相减,需要保证b的位数不高于a
    for (i = 0; i < a_len || i < b_len; i++) {
      int digit_a = (i < a_len) ? (a - '0') : 0; // 如果a已经遍历完,则将高位补0
      int digit_b = (i < b_len) ? (b - '0') : 0; // 如果b已经遍历完,则将高位补0
      int diff = digit_a - digit_b - carry; // 相减并考虑进位
      carry = (diff < 0) ? 1 : 0; // 如果相减结果小于0,则需要向高位借位
      result = (diff + 10) % 10 + '0'; // 将计算结果转换为字符并存储到result中
    }

    // 处理最高位的进位
    if (carry > 0) {
      result = carry + '0';
      result_len++;
    }

    // 在结果后面添加一个结束符
    result = '\0';

    // 将结果反转,因为从低位到高位存储时是反的
    for (i = 0, j = result_len - 1; i < j; i++, j--) {
      char temp = result;
      result = result;
      result = temp;
    }
}

int main() {
    char a; // 被减数a
    char b; // 减数b
    char result; // 结果

    // 读入被减数和减数
    scanf("%s %s", a, b);

    // 计算差值并存储到结果中
    subtract(a, b, result);

    // 输出结果
    printf("%s\n", result);

    return 0;
}
页: [1]
查看完整版本: C语言求助