# 111-1 程式設計期中考 ## 罐子 ### 題目敘述 小明喜歡喝飲料,但他沒有錢, 所以他想利用空瓶可以換飲料的機制買 給$e$、$f$、$c$ $e$ 代表他原本有的空瓶數量 $f$ 代表他今天拿到的空瓶 $c$ 代表空瓶可換的飲料數量 小明想狂喝,如果他手上有$e$、$f$ 那他今天可以喝多少罐? ### 個人解法 ```cpp= #include <iostream> using namespace std; int main() { unsigned long long e,f,c,tmp,sum=0; cin>>e>>f>>c; e+=f;//e+f就是目前擁有的空瓶數量 while(e>=c)//當空瓶數量可以換飲料 { tmp=e/c;//當前可以買多少罐 sum+=tmp;//加入罐數 e%=c;//計算剩餘的空瓶數量 e+=tmp;//因為喝完了剛剛買的飲料,又可以獲得tmp個空瓶 } cout<<sum;//算完喝了幾瓶後輸出 } ``` ### 直覺做法 ```cpp= #include <iostream> using namespace std; int main() { unsigned long long e,f,c,tmp,sum=0; cin>>e>>f>>c; e+=f; while(e>=c)//如果有空瓶可以換飲料就換一次 { e-=c-1;//扣掉空瓶數,但是喝完飲料又幫他加一 sum++;//喝的飲料數++ } cout<<sum;//算完喝了幾瓶後輸出 } ``` ## 三角形 ### 題目敘述 給$n$ 求所有邊不同而且所有邊小於等於$n$的直角三角形的數量 大部分人應該是卡在不知道Pythagorean Triangle是什麼 ### 個人解法 ```cpp= #include <iostream> using namespace std; int main() { int i,j,k,n,sum=0; cin>>n; //枚舉不同的三個變數 i j k 看可不可以組成直角三角形 for(i=1;i<=n;i++) //for(i=1;i<=n;i++) 也可以寫成這樣 { //{ for(j=1;j<i;j++) // for(j=i+1;j<=n;j++) { // { for(k=1;k<j;k++) // for(k=j+1;k<=n;k++) { // { if(i*i==j*j+k*k) // if(k*k==j*j+i*i) { // { sum++; // sum++; } // } } // } } // } } //} cout<<sum; } ``` ## 迴文 ### 題目敘述 判斷一串數字是不是迴文 就像12321,而不是12 ### 個人解法 ```cpp= #include <iostream> using namespace std; int main() { unsigned long long n,tmp,k=0,a=0,i; cin>>n; tmp=n; while(tmp)//算n有幾位 存到k { tmp/=10; k++; } for(i=0;i<k/2;i++)//倒過來取出前k/2個 12321 取出 12 { a*=10; a+=n%10; n/=10;//順便把n的後k/2位砍掉 } if(k%2)//如果是奇數位 中間那個不用管他 { n/=10; } if(a!=n) { cout<<"Not "; } cout<<"Palindrome"; } ``` 有另一個方法是整個倒過來 這邊請各位自己試試看 ## 睡覺時間 ### 題目敘述 給$H1$ $M1$ $H2$ $M2$ 求這個話很多的人睡多久 ### 個人解法 ```cpp= #include <iostream> using namespace std; int main() { int h1,m1,h2,m2; cin>>h1>>m1>>h2>>m2; m1+=h1*60;//算出第一天代表的分鐘數 m2+=h2*60;//算出第二天代表的分鐘數 if(m1>m2) { cout<<24*60-m1+m2;//算出前一天的時間到24:00+00:00到第二天的時間 } else { cout<<m2-m1;//同一天的分鐘可以直接算 } } ``` ## power函式 ### 題目敘述 寫出一個power函式 ### 個人解法 ```cpp= //應該不用多講ㄅ 手寫都考了 unsigned long long power(unsigned long long base,unsigned long long exponent) { if(exponent==0) { return 1; } return base*power(base,exponent-1); } ``` ## 數字倒序 ### 題目敘述 給一正整數$n$ 到過來輸出每個數字,中間用兩個空格隔開 ### 個人解法 ```cpp= #include <iostream> using namespace std; void f(unsigned long long a) { if(a) { cout<<a%10<<" ";//先輸出最後一位數 f(a/10); //處理剩下的 } } int main() { unsigned long long n; cin>>n; if(!n)//因為0在函式不會做 我自己寫了一個特判 { cout<<0; } f(n); } ``` 也可以用迴圈寫法 ## 比大小 ### 題目敘述 $a$、$b$、$c$ 比大小 ### 個人解法 ```cpp= //這個也不多講了 小考有討論過了 #include <iostream> using namespace std; int main() { unsigned long long a,b,c,ma; cin>>a>>b>>c; if(a==b&&a==c) { cout<<"They are equal."; } else { ma=a; if(b>ma) { ma=b; } if(c>ma) { ma=c; } cout<<ma<<" is the largest."; } } ```