close

CPE一顆星考題:

 

35.GCD

題意:

給一數N,求出任由 1至 N的所有組合最大公因數之總和G

標準輸入串
正確輸出串  
67↵\r\n
13015↵\r\n
442011↵\r\n

 

#include <iostream>
using namespace std;
int gcd(int x,int y){             //輾轉相除法求最大公因數
  while(x=x%y)
    swap(x,y);                      //swap互換值
  return y;
}
    
int main(){
  int ans[502]={0};                 //先建立陣列,初始化所有值為0           
  for (int i=1;i<502;i++){          //先選出i
    ans[i]=ans[i-1];                //讓ans[i-1],以便對齊最後的cin值
    for (int j=1;j<i;j++){          //在將i跟j迴圈做輾轉相除
      ans[i]=ans[i]+gcd(i,j);
    }
  }
  int d;
  while(cin>>d,d){                 //d=0為第一項
    cout<<ans[d]<<endl;
  }
  return 0;
}



//另一種較易懂的寫法(運行時間會較久)
#include <iostream>
using namespace std;
int gcd(int x,int y){
  while(x=x%y)swap(x,y);
  return y;
}
int main(){
  int a;
  while(cin>>a && a!=0){
    int i,j;
    int sum=0;
    for (i=1;i<=a;i++){
      for (j=i+1;j<=a;j++){     //不能跟自己算公因數重複,故加1
        sum = sum + gcd(i,j);
      }
    }
    cout<<sum<<endl;
  }
  return 0;
}
      
    
 

 

38.Can You Solve It?

題意:

如圖,會按照箭頭的順序進行移動

給兩座標,求兩座標之間的要走的步數

 

解題想法:

(0,0)為第一層

x+y座標可得(層數-1),再利用(首項+末項)項數/2 得出 該層數需要用到的步數(例如到(3,1)的層數就為3

最後加上x座)即可得從起點到該座標所需的總步數

算出從起點到座標的步數,再將兩個步數相減

 

 

標準輸入串
正確輸出串  
Case 1: 809278↵\r\n
#include <iostream>
using namespace std;
int main(){
  int c;cin>>c;
  for(int i=1;i<=c;i++){
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    int pos1,pos2;
    pos1=(x1+y1+1)*(x1+y1)/2+x1;
    pos2=(x2+y2+1)*(x2+y2)/2+x2;
    cout<<"Case "<<i<<": "<<pos2-pos1<<endl;
  }
  return 0;
}

 

 

 

 

48.Cola

題意:

超商貼著3瓶可樂瓶可以換1瓶可樂,請計算出最多可以喝到多少瓶可樂。空瓶可以跟朋友借,但是需要歸還。

解題方向:

當N(可樂瓶子數量)<=1時,可以直接印出目前的可樂瓶數,因為你再怎麼借,也無法歸還空瓶給朋友。當N>1時,用個變數(ans)紀錄已經喝過的可樂,再重新計算可樂瓶子數量(N),直到可樂瓶子數量(N)=2時,可以跟朋友借一個瓶子,即可換得最後1瓶可樂,喝完的可樂瓶剛好可以還給朋友。當可樂瓶子(N)=1時,結束迴圈,印出答案。

 

#include <iostream>
using namespace std;
int main(){
  int a;                         //a為買入的數量
  while(cin>>a){
    int sum=a,old=0;             //sum為總共可以喝多少,old紀錄剩餘無法換的空瓶子
    while(a>=3){
      old = a%3;
      a = a/3;
      sum = sum+a;
      a= a+old;

    }
    if(a==2)                     //如果a為2就可以借一瓶再還 
      sum++;
    cout<<sum<<endl;
  }
  return 0;
}
      
arrow
arrow
    全站熱搜

    ivankao 發表在 痞客邦 留言(0) 人氣()