C语言程序设计基础练习题
PTA上C語言程序設計練習題,包含 換硬幣、水仙花數、最大公約數最小公倍數、高空墜球、猴子吃桃、兔子繁衍、出租車計價、三角形判斷、簡單計算器、平面向量加法。
這些題需要一些細節或思維。
1.換硬幣:
習題4-5 換硬幣 (20 分)
將一筆零錢換成5分、2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?
輸入格式:
輸入在一行中給出待換的零錢數額x∈(8,100)。
輸出格式:
要求按5分、2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為:“fen5:5分硬幣數量, fen2:2分硬幣數量, fen1:1分硬幣數量, total:硬幣總數量”。最后一行輸出“count = 換法個數”。
輸入樣例:
13
結尾無空行
輸出樣例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
結尾無空行
1.1 分析
1.2 代碼:
#include<stdio.h> int main(){int x;scanf("%d",&x);int five,sum=0,i,j,k;five=x/5;//找最多有幾個5for(i=five;i>=1;--i){for(j=(x-i*5)/2;j>=1;--j){for(k=x-i*5-j*2;k>=1;--k){if(i*5+j*2+k==x){sum++;printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);}}}}printf("count = %d",sum); }2.水仙花數 :
習題4-6 水仙花數 (20 分)
水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等于它本身。例如:153=13 + 53+33。 本題要求編寫程序,計算所有N位水仙花數。
輸入格式:
輸入在一行中給出一個正整數N(3≤N≤7)。
輸出格式:
按遞增順序輸出所有N位水仙花數,每個數字占一行。
輸入樣例:
3
結尾無空行
輸出樣例:
153
370
371
407
結尾無空行
2.1分析與代碼
如果引用math.h頭文件中的pow函數,會導致運行超時。
所以需要自己寫一個pow函數。
3.最大公約數和最小公倍數:
習題4-7 最大公約數和最小公倍數 (15 分)
本題要求兩個給定正整數的最大公約數和最小公倍數。
輸入格式:
輸入在一行中給出兩個正整數M和N(≤1000)。
輸出格式:
在一行中順序輸出M和N的最大公約數和最小公倍數,兩數字間以1空格分隔。
輸入樣例:
511 292
結尾無空行
輸出樣例:
73 2044
結尾無空行
3.1 分析
假設現在要求最小公倍數的兩個數為x,y,他們的最大公約數為p,最小公倍數為q。則xy=pq
最大公約數求法
求最大公約數可以使用輾轉相除法:
gcd(a,b) = gcd(b,a mod b) (不妨設a>b 且r=a mod b ,r不為0)
int gg(int a,int b){int c;while(b){c=a;a=b;b=c%b;/*a mod b為零時,由于上面把b給了a,*//*所以此時的a就是最大公約數*/}return a; }3.2 代碼
#include<stdio.h> int gg(int a,int b){int c;while(b){c=a;a=b;b=c%b;}return a; } int main(){int a,b;scanf("%d %d",&a,&b);int k=gg(a,b);int m=a*b/k;//他們的最大公約數為k,最小公倍數為m。則ab=kmprintf("%d %d",k,m); }4.高空墜球
習題4-8 高空墜球 (20 分)
皮球從某給定高度自由落下,觸地后反彈到原高度的一半,再落下,再反彈,……,如此反復。問皮球在第n次落地時,在空中一共經過多少距離?第n次反彈的高度是多少?
輸入格式:
輸入在一行中給出兩個非負整數,分別是皮球的初始高度和n,均在長整型范圍內。
輸出格式:
在一行中順序輸出皮球第n次落地時在空中經過的距離、以及第n次反彈的高度,其間以一個空格分隔,保留一位小數。題目保證計算結果不超過雙精度范圍。
輸入樣例:
33 5
結尾無空行
輸出樣例:
94.9 1.0
4.1分析與代碼
從空中到落地,從地面到空中,這是兩個過程,不要只加上反彈的距離,還要考慮落地的距離。
第1次落地時,反彈數為0。我在代碼中的移動距離為離地距離加上反彈距離,所以最后一次落地時,移動距離要減去第n次反彈的距離。
#include<stdio.h>int main(){double h,n;scanf("%lf %lf",&h,&n);double sum=0,num=0;for(int i=0;i<n;++i){num = h/2;sum+=num+h;//代碼中的移動距離為離地距離加上反彈距離h=num;}printf("%.1lf %.1lf",sum-num,num);//移動距離要減去第n次反彈的距離。 }5.猴子吃桃問題
習題4-10 猴子吃桃問題 (15 分)
一只猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個;第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時,見只剩下一個桃子了。問:第一天共摘了多少個桃子?
輸入格式:
輸入在一行中給出正整數N(1<N≤10)。
輸出格式:
在一行中輸出第一天共摘了多少個桃子。
輸入樣例:
3
結尾無空行
輸出樣例:
10
5.1分析與代碼
現在是知道第n天剩的桃求第1天的桃,
第二天的桃子=第一天桃子/2-1
第i天的桃等于(第i+1天的剩的桃+1)*2,因此有:f(i)=(f(i+1)+1)?2,結束條件是f(n)=1。
#include<stdio.h> int f(int x,int n){if(x==n) return 1;else return (f(x+1,n)+1)*2; } int main(){int n,sum=1;scanf("%d",&n);printf("%d",f(1,n)); }6.兔子繁衍問題
習題4-11 兔子繁衍問題 (15 分)
一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,至少需要繁衍到第幾個月時兔子總數才可以達到N對?
輸入格式:
輸入在一行中給出一個不超過10000的正整數N。
輸出格式:
在一行中輸出兔子總數達到N最少需要的月數。
輸入樣例:
30
結尾無空行
輸出樣例:
9
6.1分析與代碼
f(n)表示n個月后的兔子總數
f(n)=n那個月原有的兔子+n那個月新生的兔子
n那個月原有的兔子是:f(n-1)
由于是第三個月起,小兔子每個月就能生,也就是說小兔子跨到大兔子其實只需要兩個月。
n那個月新生的兔子就等于兩個月前所有的兔子,因為兩個月后,這些兔子都能生了。
也就是說:n那個月新生的兔子=f(n-2)
每個月的兔子總對數可以歸納為一個分段函數:
f(n) = 1 (n=1,2)
f(n) = f(n-1) + f(n-2) (n=3,4,5)
7.出租車計價
習題3-3 出租車計價 (15 分)
本題要求根據某城市普通出租車收費標準編寫程序進行車費計算。具體標準如下:
起步里程為3公里,起步費10元;
超起步里程后10公里內,每公里2元;
超過10公里以上的部分加收50%的回空補貼費,即每公里3元;
營運過程中,因路阻及乘客要求臨時停車的,按每5分鐘2元計收(不足5分鐘則不收費)。
輸入格式:
輸入在一行中給出輸入行駛里程(單位為公里,精確到小數點后1位)與等待時間(整數,單位為分鐘),其間以空格分隔。
輸出格式:
在一行中輸出乘客應支付的車費(單位為元),結果四舍五入,保留到元。
輸入樣例1:
2.6 2
結尾無空行
輸出樣例1:
10
7.1分析與代碼
這個題主要是題意,每5分鐘2元計收,六分鐘也是兩元,因為是每5分鐘。所以t要設置為int類型。
#include<stdio.h>int main(){double x;int t;double sum=0;scanf("%lf %d",&x,&t);sum+=10;if(t>=5)sum+=t/5*2;if(x>3){//起步里程于3公里 if(x<=10) //起步里程小于等于10公里{sum+=(x-3)*2;}else{//起步里程大于10公里sum+=7*2+(x-10)*3;}}printf("%.0lf",sum);//四舍五入 }8.三角形判斷
習題3-5 三角形判斷 (15 分)
給定平面上任意三個點的坐標,檢驗它們能否構成三角形。
輸入格式:
輸入在一行中順序給出六個[?100,100]范圍內的數字,即三個點的坐標
輸出格式:
若這3個點不能構成三角形,則在一行中輸出“Impossible”;若可以,則在一行中輸出該三角形的周長和面積,格式為“L = 周長, A = 面積”,輸出到小數點后2位。
輸入樣例1:
4 5 6 9 7 8
結尾無空行
輸出樣例1:
L = 10.13, A = 3.00
結尾無空行
輸入樣例2:
4 6 8 12 12 18
輸出樣例2:
Impossible
8.1分析與代碼
這個題需要知道海倫公式,通過三邊長度求得三角形面積。
已知三角形三邊a,b,c,(p=(a+b+c)/2)
S=sqrt[p(p-a)(p-b)(p-c)]
=sqrt[(1/16)(a+b+c)(a+b-c)(a+c-b)(b+c-a)]
=1/4sqrt[(a+b+c)(a+b-c)(a+c-b)(b+c-a)]
而且經過測試發現只需要判斷兩邊之和大于第三邊,就可以確定它可以構成三角形。
三角形三邊關系的定理:“三角形任何兩邊的和大于第三邊”和它的推論:“三角形任何兩邊的差小于第三邊”
進行判斷的時候,其實只需要判斷最小的兩邊和大于最長一邊即可
#include<stdio.h> #include<math.h> int main(){double x1,y1,x2,y2,x3,y3;double l1,l2,l3;double s,c,a;scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);l1=sqrt(pow(x1-x2,2)+pow(y1-y2,2));l2=sqrt(pow(x2-x3,2)+pow(y2-y3,2));l3=sqrt(pow(x1-x3,2)+pow(y1-y3,2));if((l1+l2>l3)&&(l2+l3>l1)&&(l1+l3>l2)){//兩邊之和大于第三邊 if((l1-l2<l3)&&(l1-l3<l2)&&(l2-l1<l3)&&(l2-l3<l1)&&(l3-l2<l1)&&(l3-l1<l2)){//兩邊之差小于第三邊,這個可以忽略c=l1+l2+l3;a=c/2;s=sqrt(a*(a-l1)*(a-l2)*(a-l3));printf("L = %.2lf, A = %.2lf",c,s);}}else {printf("Impossible");} }9.簡單計算器
習題6-7 簡單計算器 (20 分)
模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算符的優先級相同,按從左到右的順序計算。
輸入格式:
輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個操作數。遇等號”=”說明輸入結束。
輸出格式:
在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算符,則輸出錯誤信息“ERROR”。
輸入樣例:
1+2*10-10/2=
結尾無空行
輸出樣例:
10
結尾無空行
9.1分析與代碼
題意說在一行中給出一個四則運算算式,說明數字和字符是交叉輸入的。所以就分別對每次的輸入進行判斷處理即可。
#include<stdio.h>int main(){int sum;int num;char a;scanf("%d",&sum);while(scanf("%c",&a)&&a!='='){scanf("%d",&num);if(a=='+') sum+=num;else if(a=='-') sum-=num;else if(a=='*') sum=sum*num;else if(a=='/'){if(num==0) {printf("ERROR");return 0;}else{sum=sum/num;}}else{printf("ERROR");return 0;}}printf("%d",sum); }10.平面向量加法
習題9-3 平面向量加法 (15 分)
本題要求編寫程序,計算兩個二維平面向量的和向量。
輸入格式:
輸入在一行中給出兩個二維平面向量的分量。
輸出格式:
在一行中按照(x, y)的格式輸出和向量,坐標輸出小數點后一位(注意不能輸出?0.0)。
輸入樣例:
3.5 -2.7 -13.9 8.7
結尾無空行
輸出樣例:
(-10.4, 6.0)
結尾無空行
分析與解答
小數部分按指定位數輸出,編譯器會進行四舍五入處理,如果和的結果是-0.04,輸出會是-0.0,而如果絕對值結果是0.05及以上,四舍五入是0.1,有了上面的條件就可以保證 結果不會出現-0.0的情況了。
#include<stdio.h> #include<string.h> int main() {double x1,y1,x2,y2;scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);double a=x1+x2;double b=y1+y2;if(fabs(a)<0.05) a=0.0;if(fabs(b)<0.05) b=0.0;printf("(%.1lf, %.1lf)",a,b); }總結
以上是生活随笔為你收集整理的C语言程序设计基础练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言使用指针在被调函数中改变主调函数的
- 下一篇: coffeescript html5,H