#include <iostream> using namespace std; int PTT(int d,int array[]){ for(int i=0;i<=3;i++){ array[i]=d%10; d=d/10; } } int main() { int arr[5]={}; int brr[5]={}; int r=0,m=0;//r為第一個數,m為第二個數 while(cin>>r>>m){ if(r==0 && m==0) break; int carryok[10]={0}; int count=0; PTT(r,arr); PTT(m,brr); for(int i=0;i<4;i++){//判斷進位的迴圈 if(arr[i]+brr[i]+carryok[i]>= 10){ carryok[i+1]++; count++; } } /*if(arr[0]+brr[0] >= 10){//個位數 carryok++; count++; } if(arr[1]+brr[1]+carryok>=10){//十位數 carryok_2++; count++; } if(arr[2]+brr[2]+carryok_2>=10){//百位數 carryok_3++; count++; } if(arr[3]+brr[3]+carryok_3>=10){//千位數 carryok_4++; count++; }*/ switch(count){ case 0: cout<<"No carry operation."<<endl; break; case 1: cout<<count<<" carry operation."<<endl; break; case 2: cout<<count<<" carry operations."<<endl; break; case 3: cout<<count<<" carry operations."<<endl; break; } } }
再來看看書上的寫法:
#include <iostream> using namespace std; int divide(int n,int arr[],int &cnt){ for(cnt=0;n!=0;cnt++){ arr[cnt]=n%10; n=n/10; } } int main() { int a,b; while(cin>>a>>b && (a!=0 || b!=0)){ int lenA=0,lenB=0; int arrA[11]={0},arrB[11]={0}; int sum[12]={0}; divide(a,arrA,lenA); divide(b,arrB,lenB); int lenM=max(lenA,lenB); int ans=0; for(int i=0;i<lenM;i++){ sum[i]=sum[i]+(arrA[i]+arrB[i]); if(sum[i]>=10){ sum[i]=sum[i]-10; sum[i+1]++; ans++; } } if(ans==0){ cout<<"No carry operation."<<endl; } else if(ans==1){ cout<<"1 carry operation."<<endl; } else cout<<ans<<" carry operation."<<endl; } }這樣寫法很彈性。
值得學習的地方有....
第11行while:把判斷0 0的狀況寫在這一行。
第3~8行與15、16行的函式寫法:另外寫個函式把值存入陣列做處理,注意該函式for迴圈中的n!=0,也可這樣寫,和第三個參數int &cnt,這是用來存這個值有幾個位數用的,假設值為4889,第6行每除一次少一個位數,直到這個位數除到變0為止,所以會做4次,而&cnt參考至lenA的記憶體位址,等於最後lenA的值也是4。
第17行:max()函數會取最大的值。
第19~26行:其實第22行可以省略,這行只是把相加的值存入陣列而已,但題目只需判斷進位次數。這迴圈就是判斷相加的進位次數,可看到第19行 i<lenM,試問,我們要怎麼知道我們判斷進位次數的for迴圈要做幾次?還是直接給它設一個固定且夠的值就好?所以我們需要知道兩數裡面位數最多的數是誰,並且有幾位數,第17行及divide函式cnt就是在做這件事。
沒有留言:
張貼留言