PTA练习题错题归纳
文章目錄
- 厘米換算英尺英寸
- tips:[另附C語言取整方法
- 實驗2-2-7 整數152的各位數字
- 實驗2-3-3 計算存款利息
- 實驗2-3-5 整數算術運算
- 實驗2-3-7 階梯電價
- 實驗2-3-8 計算火車運行時間
- 實驗2-4-2 求N分之一序列前N項和
- 實驗2-4-3 求奇數分之一序列前N項和
- 實驗2-5-4 求組合數
- 實驗4-1-1 統計數字字符和空格
- 4-1-6 求分數序列前N項和
- 實驗4-1-7 特殊a串數列求和
- tips:生成隨機數
- tips:sort()函數使用方法
- 實驗4-2-1 求e的近似值
- 實驗4-2-7 找完數
- 實驗4-2-9 水仙花數
- tips:字符串輸入知識點
- tips:C語言字符類型和數字類型互相轉換
- 實驗4-1-10 兔子繁衍問題
厘米換算英尺英寸
分數 15
作者 翁愷
單位 浙江大學
如果已知英制長度的英尺foot和英寸inch的值,那么對應的米是(foot+inch/12)×0.3048。現在,如果用戶輸入的是厘米數,那么對應英制長度的英尺和英寸是多少呢?別忘了1英尺等于12英寸。
輸入格式:
輸入在一行中給出1個正整數,單位是厘米。
輸出格式:
在一行中輸出這個厘米數對應英制長度的英尺和英寸的整數值,中間用空格分開。英寸的值應小于12。
輸入樣例:
170
輸出樣例:
5 6
答案:
tips:[另附C語言取整方法
](https://blog.csdn.net/qq_43448856/article/details/112939667)
#include<stdlib.h> #include<stdio.h> #include<math.h> // 法一: int main(){int cm,foot,inch;scanf("%d",&cm);foot=(int)(cm/30.48);inch=(int)((cm/30.48-foot)*12);printf("%d %d",foot,inch); } // 法二 /* include <stdio.h> int main(){ int cmlen;scanf("%d",&cmlen);int foot= cmlen/100.0/0.3048;int inch = (cmlen/100.0/0.3048-foot)*12;printf("%d %d\n",foot,inch); }*/實驗2-2-7 整數152的各位數字
本題要求編寫程序,輸出整數152的個位數字、十位數字和百位數字的值。
輸入格式:
本題無輸入。
輸出格式:
按照以下格式輸出:
152 = 個位數字 + 十位數字10 + 百位數字100
思路:做本題時用到求整數的各個位,求個位數為n%10,求十位數為n/10%10,求百位數為n/100%10,以此類推.
實驗2-3-3 計算存款利息
分數 10
作者 顏暉
單位 浙大城市學院
本題目要求計算存款利息,計算公式為interest=money×(1+rate)
year
?money,其中interest為存款到期時的利息(稅前),money是存款金額,year是存期,rate是年利率。
輸入格式:
輸入在一行中順序給出三個正實數money、year和rate,以空格分隔。
輸出格式:
在一行中按“interest = 利息”的格式輸出,其中利息保留兩位小數。
輸入樣例:
1000 3 0.025
輸出樣例:
interest = 76.89
思考:在解題過程中,我把year當成整數,從而導致當year不為整數時計算錯誤,為了計算year不為整數的情況,要用到求次方函數pow。原型為:double pow(double x, double y); 求x^y;使用時注意參數類型,如果x,y為整數可能運行會出錯。使用時要加上**#include<math.h>**
另附:double sqrt(double x); 計算x平方根。函數參數和返回值都是double類型,使用時x為整形也可以,不過有可能答案會出錯。
實驗2-3-5 整數算術運算
分數 10
作者 顏暉
單位 浙大城市學院
本題要求編寫程序,計算并輸出2個正整數的和、差、積、商與余數。題目保證輸入和輸出全部在整型范圍內。
輸入格式:
輸入在一行中給出2個正整數A和B。
輸出格式:
在5行中按照格式“A 運算符 B = 結果”順序輸出和、差、積、商與余數。
輸入樣例:
5 3
輸出樣例:
在這里給出相應的輸出。例如:
5 + 3 = 8
5 - 3 = 2
5 * 3 = 15
5 / 3 = 1
5 % 3 = 2
思考:題目不難,但是要注意特殊字符的輸出
實驗2-3-7 階梯電價
分數 15
作者 陳建海
單位 浙江大學
為了提倡居民節約用電,某省電力公司執行“階梯電價”,安裝一戶一表的居民用戶電價分為兩個“階梯”:月用電量50千瓦時(含50千瓦時)以內的,電價為0.53元/千瓦時;超過50千瓦時的,超出部分的用電量,電價上調0.05元/千瓦時。請編寫程序計算電費。
輸入格式:
輸入在一行中給出某用戶的月用電量(單位:千瓦時)。
輸出格式:
在一行中輸出該用戶應支付的電費(元),結果保留兩位小數,格式如:“cost = 應付電費值”;若用電量小于0,則輸出"Invalid Value!"。
輸入樣例1:
10
輸出樣例1:
cost = 5.30
思考:題目簡單,但是我犯了一個小錯誤,電價在0-50時條件寫錯了
實驗2-3-8 計算火車運行時間
分數 15
作者 沈睿
單位 浙江大學
本題要求根據火車的出發時間和達到時間,編寫程序計算整個旅途所用的時間。
輸入格式:
輸入在一行中給出2個4位正整數,其間以空格分隔,分別表示火車的出發時間和到達時間。每個時間的格式為2位小時數(00-23)和2位分鐘數(00-59),假設出發和到達在同一天內。
輸出格式:
在一行輸出該旅途所用的時間,格式為“hh:mm”,其中hh為2位小時數、mm為2位分鐘數。
輸入樣例:
1201 1530
輸出樣例:
03:29
思考:把時間全部轉換為分鐘,計算出結果后,再轉成hh:mm形式,主要是控制輸出格式不懂
如何控制輸出的格式%m.nf
%02d 右對齊輸出,位數不夠補0;
%2d右對齊輸出,位數不夠補空格;
%.2f輸出兩位小數,左對齊輸出,位數不夠自動補0;
(這里不含有四舍五入,只有保留位數,想要四舍五入也很簡單,先乘以10^(n-1)然后加0.5強制轉化就行了)
實驗2-4-2 求N分之一序列前N項和
分數 15
作者 C課程組
單位 浙江大學
本題要求編寫程序,計算序列 1 + 1/2 + 1/3 + … 的前N項之和。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點后6位。題目保證計算結果不超過雙精度范圍。
輸入樣例:
6
輸出樣例:
sum = 2.450000
題目不難,但要注意輸入輸出格式:
double,雙精度浮點型,對應%lf。
定義一個double的變量可以寫作:double a;
輸入語句可以寫作:scanf(“%lf”, &a);輸出語句可以寫作:printf(“%lf”,a);
在輸入輸出時,一定要區分好double和float,而使用對應的格式符號。
%f是以float類型格式化輸入或輸出
實驗2-4-3 求奇數分之一序列前N項和
分數 15
作者 C課程組
單位 浙江大學
本題要求編寫程序,計算序列 1 + 1/3 + 1/5 + … 的前N項之和。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點后6位。題目保證計算結果不超過雙精度范圍。
思考:讀題時把題目看錯了,注意是前n項!
實驗2-5-4 求組合數
輸入格式:
輸入在一行中給出兩個正整數m和n(m≤n),以空格分隔。
輸出格式:
按照格式“result = 組合數計算結果”輸出。題目保證結果在double類型范圍內。
輸入樣例:
2 7
輸出樣例:
result = 21
思考:題目不難,主要問題是精度問題,要認真看題目要求,說是double就要用double的變量!!
實驗4-1-1 統計數字字符和空格
本題要求編寫程序,輸入一行字符,統計其中數字字符、空格和其他字符的個數。建議使用switch語句編寫。
輸入格式:
輸入在一行中給出若干字符,最后一個回車表示輸入結束,不算在內。
輸出格式:
在一行內按照
blank = 空格個數, digit = 數字字符個數, other = 其他字符個數
的格式輸出。請注意,等號的左右各有一個空格,逗號后有一個空格。
輸入樣例:
在這里給出一組輸入。例如:
Reold 12 or 45T
輸出樣例:
blank = 3, digit = 4, other = 8
在這里給出相應的輸出。例如:
思考:題目不難,但要注意switch的用法,
1)括號內的"表達式",其值的類型應為整數類型(包括字符型)。
(2)花括號內是一個復合語句,內包含多個以關鍵字case開頭的語句行和最多一個以 default開頭的行。case后面跟一個常量(或常量表達式),它們和 default都是起標號作用,用來標志一個位置。執行switch語句時,先計算 switch后面的"表達式"的值,然后將它與各case標號比較,如果與某一個case標號中的常量相同,流程就轉到此case標號后面的語句。如果沒有與 switch表達式相匹配的case常量,流程轉去執行 default標號后面的語句。
(3)可以沒有 default標號,此時如果沒有與 switch表達式相匹配的case常量,則不執行任何語句。
(4)各個case標號出現次序不影響執行結果。
(5)每一個case常量必須互不相同;否則就會出現互相矛盾的現象。
(6)case標號只起標記的作用。**在執行 switch語句時,根據 switch表達式的值找到匹配的入口標號,在執行完一個case標號后面的語句后,就從此標號開始執行下去,不再進行判斷。**因此,**一般情況下,在執行一個case子句后,應當用 break語句使流程跳出 switchs結構。**最后一個case子句(今為 default子句)中可不加 break語句。
(7)在case子句中雖然包含了ー個以上執行語句,但可以不必用花括號括起來,會自動順序執行本case標號后面所有的語句。當然加上花括號也可以。
(8)多個case標號可以共用一組執行語句
4-1-6 求分數序列前N項和
本題要求編寫程序,計算序列 2/1+3/2+5/3+8/5+… 的前N項之和。注意該序列從第2項起,每一項的分子是前一項分子與分母的和,分母是前一項的分子。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中輸出部分和的值,精確到小數點后兩位。題目保證計算結果不超過雙精度范圍。
輸入樣例:
20
輸出樣例:
32.66
思考:要把下一項的分子分母提前存起來,以便后面賦值,如果不這樣的話,后面賦值容易錯把新值代入到計算中。
實驗4-1-7 特殊a串數列求和
給定兩個均不超過9的正整數a和n,要求編寫程序求a+aa+aaa++?+aa?a(n個a)之和。
輸入格式:
輸入在一行中給出不超過9的正整數a和n。
輸出格式:
在一行中按照“s = 對應的和”的格式輸出。
輸入樣例:
2 3
輸出樣例:
s = 246
思考:注意要把a的值保留下來,如果不保留的話,后面更新aaa時會把aa的值加進去;
tips:生成隨機數
生成隨機數之前先進行播種:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() {int a;srand((unsigned)time(NULL));a = rand();printf("%d\n", a);return 0; }生成一定范圍內的隨機數
int a = rand() % 51 + 13; //產生13~63的隨機數tips:sort()函數使用方法
#include<algorithm> using namespace std; //sort(數組名,數組名+元素個數,排序函數); int a[5]={5,3,7,2,8};sort(a,a+5);//對數組a進行排序 for(int i=0;i<5;i++){printf("%d ",a[i]);實驗4-1-12 黑洞數
分數 20
作者 C課程組
單位 浙江大學
黑洞數也稱為陷阱數,又稱“Kaprekar問題”,是一類具有奇特轉換特性的數。
任何一個各位數字不全相同的三位數,經有限次“重排求差”操作,總會得到495。最后所得的495即為三位黑洞數。所謂“重排求差”操作即組成該數的數字重排后的最大數減去重排后的最小數。(6174為四位黑洞數。)
例如,對三位數207:
第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后會停留在495這一黑洞數。如果三位數的3個數字全相同,一次轉換后即為0。
任意輸入一個三位數,編程給出重排求差的過程。
輸入格式:
輸入在一行中給出一個三位數。
輸出格式:
按照以下格式輸出重排求差的過程:
序號: 數字重排后的最大數 - 重排后的最小數 = 差值
序號從1開始,直到495出現在等號右邊為止。
輸入樣例:
123
輸出樣例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
思考:解法不難,主要是排序不能直接用sort函數
實驗4-2-1 求e的近似值
分數 15
作者 C課程組
單位 浙江大學
自然常數 e 可以用級數 1+1/1!+1/2!+?+1/n!+? 來近似計算。本題要求對給定的非負整數 n,求該級數的前 n+1 項和。
輸入格式:
輸入第一行中給出非負整數 n(≤1000)。
輸出格式:
在一行中輸出部分和的值,保留小數點后八位。
輸入樣例:
10
輸出樣例:
2.71828180
思考;題目不難,主要是注意隱含條件,比如當n取1000時,1000的階乘就超過整型的范圍了,因此求階乘函數返回時要返回double型,這樣范圍夠大運行才不會出錯。
實驗4-2-7 找完數
分數 20
作者 陳建海
單位 浙江大學
所謂完數就是該數恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程序,找出任意兩正整數m和n之間的所有完數。
輸入格式:
輸入在一行中給出2個正整數m和n(1<m≤n≤10000),中間以空格分隔。
輸出格式:
逐行輸出給定范圍內每個完數的因子累加形式的分解式,每個完數占一行,格式為“完數 = 因子1 + 因子2 + … + 因子k”,其中完數和因子均按遞增順序給出。若區間內沒有完數,則輸出“None”。
輸入樣例:
2 30
輸出樣例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
思考:題目不難,主要是要找因數
題解:
#include<stdlib.h> #include<stdio.h> #include<math.h>int main(){int m,n,sum,index,judge=0;scanf("%d %d",&m,&n);int a[100];for(int i=m;i<=n;i++){//求因數sum=0,index=0;for(int j=1;j<i;j++){if(i%j==0){sum+=j;a[index]=j;index++;}} if(sum==i && sum!=0){judge=1;printf("%d = 1",i);for(int k=1;k<index;k++){printf(" + %d",a[k]);} printf("\n");}}if(judge==0){printf("None");} }實驗4-2-9 水仙花數
分數 20
作者 徐鏡春
單位 浙江大學
水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本題要求編寫程序,計算所有N位水仙花數。
輸入格式:
輸入在一行中給出一個正整數N(3≤N≤7)。
輸出格式:
按遞增順序輸出所有N位水仙花數,每個數字占一行。
輸入樣例:
3
輸出樣例:
153
370
371
407
思考:題目不難,問題在于用pow函數會超時,所以自己重新寫了一個求次冪的函數。
實驗6-2 英文字母替換加密(大小寫轉換+后移1位)
分數 15
作者 顏暉
單位 浙大城市學院
本題要求編寫程序,將英文字母替換加密。為了防止信息被別人輕易竊取,需要把電碼明文通過加密方式變換成為密文。變換規則是:將明文中的所有英文字母替換為字母表中的后一個字母,同時將小寫字母轉換為大寫字母,大寫字母轉換為小寫字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。輸入一行字符,將其中的英文字母按照以上規則轉換后輸出,其他字符按原樣輸出。
輸入格式:
輸入一行字符,以回車符 '\n’作為 結束符。
輸出格式:
將輸入的一行字符中的所有英文字母替換為字母表中的后一個字母,同時將小寫字母轉換為大寫字母,大寫字母轉換為小寫字母后輸出,其他字符按原樣輸出。
輸入樣例:
在這里給出一組輸入。例如:
Reold Z123?
輸出樣例:
在這里給出相應的輸出。例如:
sFPME a123?
思考:字符串的輸入掌握熟悉,同時要把計算后的數據放在另一個數組里面,如果放在原來的數組里面會導致錯誤,如字母’C’在if循環時變換成‘d’,在經過else if循環時,發現滿足循環,又會把‘d’變成E,就導致了錯誤。
tips:字符串輸入知識點
https://blog.csdn.net/weixin_46768191/article/details/125984553
#include<stdlib.h> #include<stdio.h>int main(){char a[100],b[100]; // getchar();int len=0;for(int i=0;i<100;i++){scanf("%c",&a[i]);if(a[i]=='\n'){len=i;break;}}for(int i=0;i<100;i++){if('A'<=a[i] && a[i]<='Z'){if(a[i]=='Z'){b[i]=('A'+32);}else{b[i]=(a[i]+1+32);}}else if('a'<=a[i] && a[i]<='z'){if(a[i]=='z'){b[i]=('a'-32);}else{b[i]=(a[i]+1-32);}}else{b[i]=a[i];}}for(int i=0;i<len;i++){ // if(b[i]=='\n')break;printf("%c",b[i]);} }tips:C語言字符類型和數字類型互相轉換
https://blog.csdn.net/weixin_33341108/article/details/117014287
實驗4-1-10 兔子繁衍問題
分數 15
作者 徐鏡春
單位 浙江大學
一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,至少需要繁衍到第幾個月時兔子總數才可以達到N對?
輸入格式:
輸入在一行中給出一個不超過10000的正整數N。
輸出格式:
在一行中輸出兔子總數達到N最少需要的月數。
輸入樣例:
30
輸出樣例:
9
思考:開始沒看出是斐波那契數列, 先按時間計算一下123456月的兔子對數分別為 1 1 2 3 5 8 對;問題可轉化為求第幾項的斐波那契數字大于等于n
總結
以上是生活随笔為你收集整理的PTA练习题错题归纳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学(1)初一上学期数学笔记
- 下一篇: MATLAB系统仿真其三:Lorenz和