谷學長有一個非常簡單的問題給你,給你兩個整數A和B,你的任務是計算A+B。
輸入的第一行包含一個整數T(T<=20)表示測試實例的個數,然後2*T行,分別表示A和B兩個正整數。注意整數非常大,那意味著你不能用32位整數來處理。你可以確定的是整數的長度不超過1000。
對於每一個樣例,你應該輸出兩行,第一行是"Case #:",#表示第幾個樣例,第二行是一個等式"A+B=Sum",Sum表示A+B的結果。注意等式中有空格。
2 1 2 112233445566778899 998877665544332211
Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
大數加法問題,在大數運算裡面相對還算簡單,不過對初學者博主來說,思路清晰,不過寫代碼能力明顯就有點跟不上了。
下面我們來分析下吧:
前面的Case什麼的只要把相應已知數據輸出即可,下面我們重點來分析下加法的結果
首先我們看他的輸入,是連續輸入,即這個大數字各個位之間是沒有空格的,這就意味著用整型的數組難以實現數據的輸入問題。因此我們考慮用字符型數組解決輸入問題。
這裡方便起見;我們輸入字符數組a為“98”,b為“9” 來分析下思路。
原理就是模擬小學加法,要做加法,首先每位數字應對齊,才可對應相加。因此,我們考慮定義字符數組 char c[1001]來轉移並對齊a,b中的元素;
cin>>a; "98"
代碼如下:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 char a[1001],b[1001]; 6 7 void Add()//字符加法 8 { 9 10 char c[1001]; 11 memset(c,'0',1001); 12 for(int i=0;i<strlen(a);i++)//對齊 13 { 14 c[i]=a[strlen(a)-1-i]; 15 } 16 17 18 memset(a,'0',1001); 19 for(int i=0;i<strlen(b);i++) 20 { 21 a[i]=b[strlen(b)-1-i]; 22 } 23 24 for(int i=0;i<1000;i++) 25 { 26 a[i]+=c[i]-'0'; 27 if(a[i]>'9') 28 { 29 a[i]-=10; 30 a[i+1]++; 31 } 32 } 33 34 } 35 36 37 int main() 38 { 39 int T,n=0; 40 cin>>T; 41 while(T--) 42 { 43 n++; 44 memset(a,'0',1001); 45 memset(b,'0',1001); 46 47 cin>>a>>b; 48 49 cout<<"Case "<<n<<":"<<endl; 50 cout<<a<<" + "<<b<<" = "; 51 52 53 Add(); 54 55 int k; 56 for(k=1000;k>=0;k--)//排前導0 57 { 58 if(a[k]!='0') 59 {break;} 60 } 61 for(int i=k;i>=0;i--) 62 { 63 cout<<a[i]; 64 } 65 cout<<endl; 66 } 67 return 0; 68 }