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