日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言程序设计基础练习题

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 分析

  • 要求按5分、2分和1分硬幣的數量依次從大到小的順序,所以先找最多有幾個5分,由于要求每種硬幣至少有一枚,所以從最多可能的個數遍歷到只有一個。
  • 其中i,j,k表示每個硬幣的個數。確定了5分硬幣個數后,可以繼續確定2分硬幣的個數j=(x-i*5)/2。然后確定1分硬幣的個數k。
  • 最后進行判斷,如果所有硬幣加起來等于待換的零錢數額,那么輸出。
  • 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函數。

    #include<stdio.h> long long pow(int a,int b){long long sum=1;for(int i=0;i<b;++i){sum=sum*a;}return sum; } int main(){int n;scanf("%d",&n);long long begin=pow(10,n-1),end=pow(10,n);long long m,sum=0,i;for(i=begin;i<end;++i){//水仙花數的范圍-N位正整數m=i;while(m>0){//對m的每一項進行處理sum+=pow(m%10,n);if(sum>i) break;m=m/10;}if(sum==i) {printf("%d\n",i);}sum=0;} }

    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)

    #include<stdio.h>int main(){int n;scanf("%d",&n);int a[100],i;a[1]=a[2]=1;if(n==1){printf("%d",1);return 0;}for(i=3;;i++){a[i]=a[i-1]+a[i-2];if(a[i]>=n) {printf("%d",i);return 0;}} }

    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语言程序设计基础练习题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。