大數加法(JSU-ZJJ)
阿新 • • 發佈:2018-12-23
題目描述
給定任意位數長度的兩個數,求它們數值之和。
輸入
每個測試用例含有兩個數,代表兩個任意位數長度的數A,B.
輸出
計算出這兩個任意位數長度的數之和。
樣例輸入
123451234512345 543215432154321
12.345 54.321
樣例輸出
666666666666666
66.666
分析:
此題,相比於之前的大數而言,多了小數。其實在也不過是簡單大數的加強版吧。在本題中,我卡了。第一,是因為陣列一開始只開了1000大小,導致一直執行錯誤。第二,是沒有考慮特殊情況。1.99+0.01=2;我一開始以為是要輸出2.00;但是很明顯不是這樣的。是隻輸出一個2。就行了
對於本題我的基本思路是。先對齊,按小數點的那個位置對齊。這樣的話,個位百位就會一一對應。如果沒有小數點的話,也是可以直接按末尾對齊,以達到個位百位一一對應的情況。然後直接從最後開始依次相加至第三個陣列。
#include"stdio.h" #include"string.h" //定位至小數點,如果沒有小數點則定位至末尾 int GPS(char digit[10000]) { int i,l; l=strlen(digit); for(i=0;i<l;i++) if(digit[i]=='.') break; return i; } //按照GPS函式返回的小數點的位置,將個位百位對齊。 void Corresponding(char *digitA,int pointA,char *digitB,int pointB) { char transfer[10000]; int i; if(pointA!=pointB) { if(pointA>pointB) { strcpy(transfer,digitB); strcpy(digitB+(pointA-pointB),transfer); for(i=0;i<pointA-pointB;i++) digitB[i]='0'; // puts(digitA); // puts(digitB); } else { strcpy(transfer,digitA); strcpy(digitA+(pointB-pointA),transfer); for(i=0;i<pointB-pointA;i++) digitA[i]='0'; // puts(digitA); // puts(digitB); } } } //相加函式 void ADD(char digitA[10000],int pointA,int leghtA,char digitB[10000],int pointB,int leghtB,char digitC[10001]) { int mark=0,pre,leghtC,point,M,j; digitC[leghtA+1]='\0'; digitC[leghtB+1]='\0'; if(leghtA>leghtB) leghtC=leghtA+1; else leghtC=leghtB+1; point=leghtC; while(leghtA>leghtB) { digitC[leghtA]=digitA[leghtA-1]; leghtA--; } while(leghtB>leghtA) { digitC[leghtB]=digitB[leghtB-1]; leghtB--; } while(leghtB>0) { if(digitA[leghtB-1]=='.') { point=leghtB-1; digitC[leghtB]='.'; leghtB--;continue; } if(digitA[leghtB-1]-'0'+digitB[leghtB-1]-'0'+mark>9) pre=1; else pre=0; digitC[leghtB]=(digitA[leghtB-1]-'0'+digitB[leghtB-1]-'0'+mark)%10+'0'; mark=pre; leghtB--; } if(mark==1) {digitC[0]='1'; } else digitC[0]='-1'; leghtC=strlen(digitC); point=0; //判斷2.00的特殊情況。 while(digitC[point]!='\0'&&point<leghtC) if(digitC[point]=='.') break; else point++; M=0;j=point; while(point<leghtC) { if(digitC[point]>='1'&&digitC[point]<='9') M=1; point++; } if(M==0) digitC[j]='\0'; if(mark==0) printf("%s\n",(digitC+1)); else printf("%s\n",(digitC)); } int main() { char digitA[10000],digitB[10000],digitC[10001]; int leghtA,leghtB,pointA,pointB,POINT; int i,j,k; while(~scanf("%s%s",digitA,digitB)) { pointA=GPS(digitA); pointB=GPS(digitB); Corresponding(digitA,pointA,digitB,pointB); //puts(digitA); //puts(digitB); POINT=GPS(digitA); pointA=POINT; pointB=POINT; leghtA=strlen(digitA); leghtB=strlen(digitB); ADD(digitA,pointA,leghtA,digitB,pointB,leghtB,digitC); } }