前幾天剛開始對PAT甲級的刷題,首次看到英語的題目,讓原本就菜的我更是頭禿,但第一題叫了n遍以後滿分通過的時候還是蠻爽的,在此僅記錄一下該題的個人解題心路,菜鳥記錄,技術極低。 Calculate a+b and output the sum in standard format -- that i ...
前幾天剛開始對PAT甲級的刷題,首次看到英語的題目,讓原本就菜的我更是頭禿,但第一題叫了n遍以後滿分通過的時候還是蠻爽的,在此僅記錄一下該題的個人解題心路,菜鳥記錄,技術極低。
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
Input Specification:
Each input file contains one test case. Each case contains a pair of integers a and b where −106≤a,b≤106. The numbers are separated by a space.
Output Specification:
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
Sample Input:
-1000000 9
Sample Output:
-999,991
題目分析:
加法計算,但是輸出格式需分成三個一組,輸入和輸出的數據範圍控制在10e-6~10e6。
個人想法:
首先,加法的計算和數據的範圍無需多說,即重點在於輸出的分組,開始我以為作為第一題,會是一個近乎沒有結構或演算法的題目,於是在開始之前以為會是有關鍵字或某個庫中的函數,遲遲不敢下筆而是苦思冥想有沒有學過,腦海搜索失敗後開始編寫這道題。
由於10e6三個一組並沒有太多組,所以僅在該題中可以用if語句寫,雖然很笨,但有用。
第一次提交:
1 #include<stdio.h> 2 3 int main () 4 { 5 int a, b; 6 int sum; 7 int s; //記錄sum值千位以上的數值,方便輸出 8 scanf("%d%d", &a, &b); 9 sum = a + b; 10 s = sum / 1000; 11 while (sum / 1000 != 0) 12 { 13 s = sum / 1000; 14 if (s >= 1000) 15 { 16 a=s/ 1000; 17 printf("%d,", a); 18 s %= 1000; 19 } 20 if (s / 100 != 0) { 21 printf("%d\n", s); 22 } 23 else if (s / 10 != 0) { 24 printf("0%d\n", s); 25 } 26 else 27 { 28 printf("00%d,", s); 29 30 } 31 sum = sum % 1000; 32 } 33 if (sum / 100 != 0) { 34 printf("%d\n", sum); 35 } 36 else if(sum/10!=0) { 37 printf("0%d\n", sum); 38 } 39 else 40 { 41 printf("00%d\n", sum); 42 43 } 44 return 0; 45 }
提交結果:
20分只有2分的屑。。。經過多次測試,發現問題很多,例如:當sum值不超過100時,答案會是025或005這樣的格式,0並沒有消除,與預期所想不符,大刀闊斧改一下。
第二次提交:
#include<stdio.h> int main() { int a, b; int sum; int s; scanf("%d%d", &a, &b); sum = a + b; s = sum / 1000; while (sum / 1000 != 0||s>0) { if (s / 1000 !=0) { a=s/ 1000; printf("%d,", a); s %= 1000; } if (s / 100 != 0) { printf("%d,", s); s = 0; } else if (s / 10 != 0) { printf("%02d,", s); s = 0; } else { printf("%03d,", s); s = 0; } sum = sum % 1000; } if (sum / 100 != 0) { printf("%d\n", abs(sum)); } else if(sum/10!=0) { printf("%02d\n", abs(sum)); } else { printf("%03d\n", abs(sum)); } return 0; }View Code
提交結果:
第二次測試對s進行了改進,在while的判定條件裡加入了||s>0,併在幾個if語句中對s進行清零,意圖通過對高位的判別進行改進,然而還是會有小錯誤,其中還要特殊情況,sum=0時出現的000。於是在第三次進行改進時,乾脆將幾個,分開的組用不同變數進行記錄。
<--------------------------------------------------------------------------------------------------------------------------------------------------------------->
第三次提交:
1 //10e6===1,000,000 2 3 #include<stdio.h> 4 #include<math.h> 5 6 int main() 7 { 8 int a,b; 9 int sum; 10 scanf("%d%d",&a,&b); 11 sum=a+b; 12 13 int t=0,s,x; 14 if(sum<0) t=1; 15 sum=abs(sum); 16 s=sum/1000; 17 x=s/1000; 18 sum%=1000; 19 if(t) 20 { 21 if(x) 22 { 23 s%=1000; 24 printf("-%d,%03d,%03d\n",x,s,sum); 25 } 26 else if(s) 27 printf("-%d,%03d\n",s,sum); 28 else if(sum) 29 printf("-%d\n",sum); 30 } 31 else 32 { 33 if(x) 34 { 35 s%=1000; 36 printf("%d,%03d,%03d\n",x,s,sum); 37 } 38 else if(s) 39 printf("%d,%03d\n",s,sum); 40 else if(sum) 41 printf("%d\n",sum); 42 else 43 printf("0\n"); 44 } 45 return 0; 46 47 }
最終結果:
滿分通過。
補充:
網上看來的,比起增加變數,這樣的if語句更加簡潔。先判斷sum值是否為負數,為負數時就先輸出 - 號,在判斷sum的大小,根據範圍依次輸出。
總結:
首先,僅基於對題目的演算法進行編寫,如果脫離題目,那麼範圍就可能太小了,需要多個變數和if語句。其次,題目本身並無難問題,調試過程中直覺得是邏輯問題,無新的地方。最後,對於PAT甲級,英語題目,除了數據結構和演算法,英語也要提升。