【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的加法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
【输出形式】
输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。
算法提示:
1.用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字符。
2.以较短的超长整数为基准,从低位到高位,对应位转换成数字后相加,再加上前一位相加的进位,得到的和模上10再转换为字符即为当前位,得到的和整除10即为当前位的进位。将计算得到的每一位保存到结果字符数组。
3.将较长字符串的剩余位加上最后一个进位移到结构数组后面。
4.将结果数组反序输出(去掉高位多余的0)。
【输入样例】
134098703578230056
234098
【输出样例】
134098703578464154
【样例说明】
进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。
【评分标准】
完全正确得20分,每个测试点4分,提交程序文件名为add.c。
----------------------------
个人代码:
#include <stdio.h> #include <string.h> int jinwei = 0; int invert(char *s){ int i=0,j,l; char temp; l = strlen(s); j = l-1; while(s[i]=='0'){ l--; s[i] = s[j]; s[j] = '\0'; i++; j--; } for(;j>i;i++,j--){ temp = s[i]; s[i] = s[j]; s[j] = temp; } return l; } char add(int a, int b){ int temp; temp = (a+b)%10+jinwei; jinwei = (a+b)/10; if(temp==10){ temp = 0; jinwei++; } return temp+'0'; } int main(){ char a[128],b[128],res[128]={'0'}; int la,lb,i,lres; gets(a); gets(b); la = invert(a); lb = invert(b); for(i=0;i<la&&i<lb;i++){ res[i] = add(a[i]-'0',b[i]-'0'); } if(la<lb){ for(;b[i]!='\0';i++){ res[i] = add(0,b[i]-'0'); } } else{ for(;a[i]!='\0';i++){ res[i] = add(a[i]-'0',0); } } if(jinwei==1) res[i++] = '1'; res[i] = '\0'; lres = strlen(res); for(i=lres-1;i>=0;i--) printf("%c",res[i]); printf("\n"); getchar(); return 0; }
标答:
#include <stdio.h> #include <string.h> main() { char a[128], b[128], r[128] = "00000000000000"; char *longer, *shorter; static int temp = 0; int i, j, lengthOfLonger, lengthOfShorter; scanf("%s %s", a, b); if (strlen(a) > strlen(b)) { longer = a; shorter = b; } else { longer = b; shorter = a; } lengthOfLonger = strlen(longer); lengthOfShorter = strlen(shorter); for (i = lengthOfShorter - 1, j = lengthOfLonger - 1; i >= 0; i--, j--) { r[j+1] = longer[j] + shorter[i] - '0' + temp; if (r[j+1] > '9') { r[j+1] -= 10; temp = 1; } else { temp = 0; } } for (; j >= 0; j--) { r[j+1] = longer[j] + temp; if (r[j+1] > '9') { r[j+1] -= 10; temp = 1; } else { temp = 0; } } r[j + 1] = temp + '0'; for (i = 0; r[i] == '0'; i++) { ; } for (; i < lengthOfLonger + 1; i++) { printf("%c", r[i]); } printf("\n"); }
----------------
1、对于两个数组a[]、b[],若需要区分长短,可以定义两个指针 *longer、*shorter,若 a[] 较长,则 longer = a,那么 a[] 就是 longer[],用这种方法来简化代码。
char a[128], b[128]; char *longer, *shorter; int lengthOfLonger, lengthOfShorter; scanf("%s %s", a, b); if (strlen(a) > strlen(b)) { longer = a; shorter = b; } else { longer = b; shorter = a; } lengthOfLonger = strlen(longer); lengthOfShorter = strlen(shorter);