【問題描述】
編寫程序實現兩個超長正整數(每個最長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);