【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的减法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
【输出形式】
输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。
【输入样例】
234098
134098703578230056
【输出样例】
-134098703577995958
【样例说明】
进行两个正整数减法运算, 234098 -134098703578230056 = -134098703577995958。
【评分标准】
完全正确得20分,每个测试点4分,提交程序文件名为subtract.c。
【思路】
1.首先去掉整数开头可能出现的'0',得到有效部分
2.与上一题类似也是分情况讨论。
3.分情况之后加减法注意借位的计算即可
#include <stdio.h>
#include <string.h>
#include <math.h>
char s1[100], s2[100];
char result[100];
char temp1[100], temp2[100];
char sum[100];
int main() {
scanf("%s", s1);
scanf("%s", s2);
int x1 = strlen(s1), x2 = strlen(s2);
int q1 = 0, q2 = 0, d = 0, d1 = 0, d2 = 0;
int j = 0, f = 0, l = 0, y = 0, i = 0;
int bor;
int len1, len2;
char temp;
for (int z = 0; z <= x1; z++) {
if (s1[z] != '0') {
q1 = z;
break;
}
}
for (int z = 0; z <= x2; z++) {
if (s2[z] != '0') {
q2 = z;
break;
}
}
len1 = x1 - q1, len2 = x2 - q2;
f = x2 - 1;
if (len1 > len2) {
for (int o = x1 - 1; o >= q1; o--) {
if (f >= q2) {
if (s1[o] >= s2[f]) {
result[j] = s1[o] - s2[f] + '0';
j++, f--;
} else {
result[j] = '9' + 1 - (s2[f] - s1[o]);
if (s1[o - 1] == '0') {
bor = o - 1;
while (s1[bor] == '0') {
s1[bor] = '9';
bor--;
}
s1[bor] -= ('1' - '0');
} else {
s1[o - 1] -= ('1' - '0');
}
j++, f--;
}
} else {
for (int w = 0; w < abs(x1 - x2); w++) {
result[j] = s1[o];
j++, o--;
}
}
}
for (int r = j - 1; r >= 0; r--) {
if (result[r] != '0') {
l = r;
break;
}
}
d = l;
for (l, i; i <= l; l--, i++) {
temp = result[l];
result[l] = result[i];
result[i] = temp;
}
for (int t = 0; t <= d; t++) {
printf("%c", result[t]);
}
}
if (len1 == len2) {
d1 = q1, d2 = q2;
for (int i = 0; i <= len1; i++) {
temp1[i] = s1[d1];
d1++;
}
for (int i = 0; i <= len2; i++) {
temp2[i] = s2[d2];
d2++;
}
if (strcmp(temp1, temp2) > 0) {
for (int o = x1 - 1; o >= q1; o--) {
if (f >= q2) {
if (s1[o] >= s2[f]) {
result[j] = s1[o] - s2[f] + '0';
j++, f--;
} else {
result[j] = '9' + 1 - (s2[f] - s1[o]);
if (s1[o - 1] == '0') {
bor = o - 1;
while (s1[bor] == '0') {
s1[bor] = '9';
bor--;
}
s1[bor] -= ('1' - '0');
} else {
s1[o - 1] -= ('1' - '0');
}
j++, f--;
}
} else {
for (int w = 0; w < abs(x1 - x2); w++) {
result[j] = s1[o];
j++, o--;
}
}
}
for (int r = j - 1; r >= 0; r--) {
if (result[r] != '0') {
l = r;
break;
}
}
d = l;
for (l, i; i <= l; l--, i++) {
temp = result[l];
result[l] = result[i];
result[i] = temp;
}
for (int t = 0; t <= d; t++) {
printf("%c", result[t]);
}
} else if (strcmp(temp1, temp2) == 0) {
printf("0");
} else {
f = x1 - 1;
for (int o = x2 - 1; o >= q2; o--) {
if (f >= q1) {
if (s2[o] >= s1[f]) {
result[j] = s2[o] - s1[f] + '0';
j++, f--;
} else {
result[j] = '9' + 1 - (s1[f] - s2[o]);
if (s2[o - 1] == '0') {
bor = o - 1;
while (s2[bor] == '0') {
s2[bor] = '9';
bor--;
}
s2[bor] -= ('1' - '0');
} else {
s2[o - 1] -= ('1' - '0');
}
j++, f--;
}
} else {
for (int w = 0; w < abs(x1 - x2); w++) {
result[j] = s2[o];
j++, o--;
}
}
}
for (int r = j - 1; r >= 0; r--) {
if (result[r] != '0') {
l = r;
break;
}
}
d = l;
for (l, i; i <= l; l--, i++) {
temp = result[l];
result[l] = result[i];
result[i] = temp;
}
printf("-");
for (int t = 0; t <= d; t++) {
printf("%c", result[t]);
}
}
}
if (len1 < len2) {
f = x1 - 1;
for (int o = x2 - 1; o >= q2; o--) {
if (f >= q1) {
if (s2[o] >= s1[f]) {
result[j] = s2[o] - s1[f] + '0';
j++, f--;
} else {
result[j] = '9' + 1 - (s1[f] - s2[o]);
if (s2[o - 1] == '0') {
bor = o - 1;
while (s2[bor] == '0') {
s2[bor] = '9';
bor--;
}
s2[bor] -= ('1' - '0');
} else {
s2[o - 1] -= ('1' - '0');
}
j++, f--;
}
} else {
for (int w = 0; w < abs(x1 - x2); w++) {
result[j] = s2[o];
j++, o--;
}
}
}
for (int r = j - 1; r >= 0; r--) {
if (result[r] != '0') {
l = r;
break;
}
}
d = l;
for (l, i; i <= l; l--, i++) {
temp = result[l];
result[l] = result[i];
result[i] = temp;
}
printf("-");
for (int t = 0; t <= d; t++) {
printf("%c", result[t]);
}
}
return 0;
}
【思路】