前言:
只要是c++有關於指標的都會記錄在這裡,不定期新增內容。
2016/12/21
10035 - Primary Arithmetic
這是我自己的寫法,沒想到竟然寫得出來,盡管彈性不好,但自己動手寫一次思考一下很重要。
再來看看書上的寫法:
值得學習的地方有....
第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就是在做這件事。
#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就是在做這件事。
2016/12/16
C++ 像陣列的Vector
- Vector可代替陣列,也可當加強版陣列
- 可用陣列形式操作Vector
- 使用前,加入表頭檔#include <vector>
- 使用前先設定好長度、型態 vector<int> ivector(10);//表型態為int,長度為10
- 可用size()看自己長度
- 可用empty()看是否空
2016/12/15
訂閱:
文章 (Atom)