NYOJ A+B IV 小數相加(大數問題)
阿新 • • 發佈:2019-01-06
A+B Problem IV
時間限制:1000 ms | 記憶體限制:65535 KB 難度:3- 描述
- acmj最近發現在使用計算器計算高精度的大數加法時很不方便,於是他想著能不能寫個程式把這個問題給解決了。
- 輸入
- 包含多組測試資料
每組資料包含兩個正數A,B(可能為小數且位數不大於400) - 輸出
- 每組輸出資料佔一行,輸出A+B的結果,結果需要是最簡的形式。
- 樣例輸入
-
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
- 樣例輸出
-
2 1 3.33 7
思路:把兩個數當字串輸入,存放到兩個陣列中。再檢測是否有小數點,開兩個陣列大小為前面兩倍,中間一個位置存放小數點,小數點左邊存放小數部分,小數點右邊存放整數部分(倒著存放)。然後兩個倒序後的陣列相加,用第三個同等大小的陣列存放結果。同時檢測整數部分前面的零和小數部分後面的零,去掉多餘的零。詳細看程式碼部分。
#include<stdio.h> #include<string.h> char s1[410],s2[410]; int a1[820],b1[820]; char result[820]; void create(char *s,int *a) { int len=strlen(s); int k; if(strchr(s,'.')!=NULL) //判斷有無小數點 k=strchr(s,'.')-s; //標記小數點的位置 else k=len; // 無小數點 for(int i=k+1,j=399;i<len;i++,j--)//小數點後面的存到前四百位 a[j]=s[i]-'0'; for(int i=k-1,j=400;i>=0;i--,j++)//小數點前面的存放到後四百位 a[j]=s[i]-'0'; } void init() { memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); memset(result,0,sizeof(result)); } void sum() { int s,v=0; for(int i=0;i<820;i++) { s=a1[i]+b1[i]+v; result[i]=s%10; v=s/10; } } void print() { int i=820; while(result[i]==0&&i>=400) { i--; } int j=0; while(result[j]==0&&j<400) { j++; } if(i==399&&j==400)//全是零的情況 printf("0\n"); else { for(;i>=400;i--) { printf("%d",result[i]); } if(j!=400) { printf("."); } for(int i=399;i>=j;i--) printf("%d",result[i]); printf("\n"); } } int main() { while(~scanf("%s %s",s1,s2)) { init(); //每計算一次初始化陣列 create(s1,a1);//轉化過程(2倍陣列倒序存放小數或整數) create(s2,b1);//轉化過程 sum();//進位求和過程 print(); } return 0; }