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