時間限制:1 秒
內存限制:32 兆
特殊判題:否
提交:9939
解決:3477
- 題目描述:
-
實現一個加法器,使其能夠輸出a+b的值。
- 輸入:
-
輸入包括兩個數a和b,其中a和b的位數不超過1000位。
- 輸出:
-
可能有多組測試數據,對於每組數據,
輸出a+b的值。
- 樣例輸入:
-
2 6 10000000000000000000 10000000000000000000000000000000
- 樣例輸出:
-
8 10000000000010000000000000000000
- 來源:
- 2010年華中科技大學計算機研究生機試真題
//代碼思路參考輔導書
#include<iostream> #include<stdio.h> #include<cstring> #define Max 1000 using namespace std; struct BigInt{ int size; //用來記錄大整數的位數 int big[Max]; //用來記錄大整數,每4位放入一個數組單元 void init(){ for(int i=0;i<Max;i++){ big[i]=0; //對大整數進行初始化 } size=0; } void set(char str[]){ //將字符串轉化爲數組,按每4位一個單元存儲 init(); //先對結構體進行初始化 int len=strlen(str); for(int i=len-1,j=0,c=1,t=0;i>=0;i--){ //注意,大整數的最高位存儲再big[0],然後再依次存入地位,所以要從len-1開始循環 t+=(str[i]-'0')*c; //用t來暫存4位整數,其中c爲每位的權值, 注意是-'0'而非+'0' c*=10; j++; //用來記錄取了幾位 if(j==4||i==0){ //如果已經達到4個字符或者已經到了最後一位數,及最高位 //注意應從最低位向最高位取,否者12345會將 1234存入一個數組,5000再另外一個數組則與原數不等 big[size++]=t; //再big中低位就再big[0]中 j=0; c=1; t=0; } } } void Outprint(){ //用於輸出 for(int i=size-1;i>=0;i--){ if(i!=size-1) printf("%04d",big[i]); //如果是不是最高位則要輸出前導位0,比如110001,就要輸出1前面的3個0 else printf("%d",big[i]); } printf("\n"); } BigInt operator + (const BigInt &A) const{ //加法運算符重載 BigInt res; //用於存儲計算結果 res.init(); //別忘了初始化 int carry=0; //用於存放數組的進位 for(int i=0;i<size||i<A.size;i++){ //從低位開始加 int tmp=big[i]+A.big[i]+carry; //res的每個數組單元等於兩個大整數對應的數組單元的和加上進位 carry=tmp/10000; //算出進位 tmp%=10000; //除了進位之外的其他後四位 res.big[res.size++]=tmp; } if(carry!=0){ //上面執行完了後還有進位則存儲起來 res.big[res.size++]=carry; } return res; } }a,b,c; int main(){ char str1[Max+2],str2[Max+2]; while(scanf("%s%s",str1,str2)!=EOF){ a.set(str1); b.set(str2); c=a+b; c.Outprint(); } return 0; }