九度OJ-1198-a+b--高精度整數

題目1198:a+b

時間限制: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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章