PTA - C语言暑假题集3

7-43 求组合数

本题要求编写程序,根据公式
C^m_n=\frac{n!}{m!(n-m)!}
​ 算出从n个不同元素中取出m个元素(m≤n)的组合数。
建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。

输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入样例:
2 7
输出样例:
result = 21

#include <stdio.h>

double Fac(int x){
    double res=1;
    for(int i=2;i<=x;i++){
        res*=i;
    }
    return res;
}
int main(){
    int m,n;scanf("%d %d",&m,&n);
    double fz=Fac(n);
    double fm=Fac(m)*Fac(n-m);
    double res=fz/fm;
    printf("result = %.0f",res);
}

7-44 求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m^2 + 1/m+ (m+1) ^2+ 1/(m+1)+…+ n ^2 + 1/n

输入格式:
输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例:
5 10
输出样例:
sum = 355.845635

#include <stdio.h>
#include <math.h>

int main(){
    int m,n;scanf("%d %d",&m,&n);
    double sum=0;
    
    for(int i=m;i<=n;i++){
        sum+=pow(i,2);
        sum+=1.0/i;
    }
    printf("sum = %.6f",sum);
    return 0;
}

7-45 求交错序列前N项和

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。

输入样例:
5
输出样例:
0.917

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    double fm=1,sum=0;
    int flag=1;
    for(int i=1;i<=n;i++){
        sum+=flag*i*1.0/fm;
        fm+=2;
        flag*=-1;
    }
    printf("%.3f",sum);
    return 0;
}

7-46 求平方根序列前N项和

本题要求编写程序,计算平方根序列 \sqrt{1}+\sqrt{2}+\sqrt{3} +⋯的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。

输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
10
输出样例:
sum = 22.47

#include <stdio.h>
#include <math.h>

int main(){
    int n;scanf("%d",&n);
    double sum=0;
    for(int i=1;i<=n;i++){
        sum+=sqrt(i);
    }
    printf("sum = %.2f",sum);
    return 0;
}

7-47 求阶乘序列前N项和

本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。

输入格式:
输入在一行中给出一个不超过12的正整数N。
输出格式:
在一行中输出整数结果。

输入样例:
5
输出样例:
153

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int sum=0,x=1;
    for(int i=1;i<=n;i++){
        x*=i;
        sum+=x;
    }
    printf("%d",sum);
    return 0;
}

7-48 求给定精度的简单交错序列部分和

本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。

输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310

#include <stdio.h>
#include <math.h>

int main(){
    double x;scanf("%lf",&x);
    double sum=0,flag=1;
    for(int i=1;;i+=3){
        sum=sum+flag*1.0/i;
        flag*=-1;
        if(1.0/i<=x) break;
    }
    printf("sum = %.6f",sum);
    
    return 0;
}

7-49 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!

#include <stdio.h>

int main(){
    // 输入随机数和猜测的最大次数
    int num,time;scanf("%d %d",&num,&time);

    int x,cnt=0,flag=0;
    while(1){
        scanf("%d",&x);
        cnt++;
        if(cnt>time) break;

        if(x<0) break;
        else if(x>num) printf("Too big\n");
        else if(x<num) printf("Too small\n");
        else if(x==num) {
            flag=1; // 猜到
            break;
        }
    }

    if(flag==1 && cnt<=time){
        if(cnt==1) printf("Bingo!");
        else if(cnt <= 3) printf("Lucky You!");
        else if(cnt >3 && cnt<=time) printf("Good Guess!");
    }
    else printf("Game Over");
    return 0;
}
// 该跳出循环 就应即时跳出 不然会超时

7-50 求e的近似值

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。

输入样例:
10
输出样例:
2.71828180

#include <stdio.h>

double Fac(int x){
    double res=1;
    for(int i=1;i<=x;i++) res*=i;
    return res;
}
double fac[1001];
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        fac[i]=Fac(i);
    }
    double sum=1;
    for(int i=1;i<=n;i++){
        sum+=1.0/fac[i];
    }
    printf("%.8f",sum);
    return 0;
}

7-51 找出最小值

本题要求编写程序,找出给定一系列整数中的最小值。

输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

输入样例:
4 -2 -123 100 0
输出样例:
min = -123

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int min=99999,x;
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        if(x<min) min=x;
    }
    printf("min = %d",min);
    return 0;
}

7-52 统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:
10 31
输出样例:
7 143

#include <stdio.h>

int isPrime(int x){
    if(x==1) return 0;
    if(x<=3) return 1;
    if(x%2==0 || x%3==0) return 0;
    for(int i=5;i*i<=x;i+=6){
        if(x%i==0 || x%(i+2)==0) return 0;
    }
    return 1;
}
int main(){
    int m,n;scanf("%d %d",&m,&n);
    int cnt=0,sum=0;
    for(int i=m;i<=n;i++){
        if(isPrime(i)) {
            cnt++;
            sum+=i;
        }
    }
    printf("%d %d",cnt,sum);
    return 0;
}

7-53 求奇数和

本题要求计算给定的一系列正整数中奇数的和。

输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。

输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116

#include <stdio.h>

int main(){
    int x;
    int sum=0;
    while(scanf("%d",&x) && x>0){
        if(x%2!=0) sum+=x;
    }
    printf("%d",sum);
    return 0;
}

7-54 求分数序列前N项和

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66

#include <stdio.h>
#include <math.h>

int main(){
    int n;scanf("%d",&n);
    double fz=2,fm=1;
    double sum=2;
    for(int i=2;i<=n;i++){
        sum+=(fz+fm)*1.0/fz;
        // 更新分子分母
        double temp=fz;
        fz=fz+fm;
        fm=temp;
    }
    printf("%.2f",sum);
    return 0;
}
// 有一个测试没通过是因为数据类型!!!

7-55 特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。

输入样例:
2 3
输出样例:
s = 246

#include <stdio.h>

int main(){
    int a,n;scanf("%d %d",&a,&n);
    int sum=0;
    int x=0;
    for(int i=1;i<=n;i++){
        x=x*10+a;
        sum+=x;
    }
    printf("s = %d",sum);
    return 0;
}

7-56 换硬币

将一笔零钱换成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

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int cnt=0,Cnt=0;
    for(int i=n/5;i>=1;i--){
        for(int j=n/2;j>=1;j--){
            int k=n-i*5-j*2;
            if(k>=1 && i*5+j*2+k==n){
                Cnt++;
                cnt=i+j+k;
                printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,cnt);
            }
        }
    }
    printf("count = %d",Cnt);
    return 0;
}

7-57 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1 ^3 + 5 ^3 + 3 ^3
本题要求编写程序,计算所有N位水仙花数。

输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:
3
输出样例:
153
370
371
407

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    // 预计算每一个数字的n次方
    int powers[10];
    for (int i = 0; i < 10; i++)
        powers[i] = pow(i, n);

    // 确定下限和上限
    int lower_limit = pow(10,n-1);
    int upper_limit = pow(10,n);

    for (int i = lower_limit; i < upper_limit; i++) {
        int sum = 0;
        int temp = i;
        while (temp) {
            int digit = temp % 10;
            sum += powers[digit];
            temp /= 10;
        }
        if (sum == i)
            printf("%d\n", i);
    }

    return 0;
}

7-58 最大公约数和最小公倍数

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:
511 292
输出样例:
73 2044
a和b的最大公约数和最小公倍数:
最大公约数 - b等于0时a的值
最小公倍数 (a*b)/最大公约数

#include <stdio.h>

int gys(int a,int b){
    int temp;
    while(b!=0){
        temp=b;
        b=a%b;
        a=temp;
    }
    return a;
}
int gbs(int a,int b){
    return (a*b)/gys(a,b);
}
int main(){
    int a,b;scanf("%d %d",&a,&b);
    int ans1=gys(a,b);
    int ans2=gbs(a,b);
    printf("%d %d",ans1,ans2);
    return 0;
}

7-59 高空坠球

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
注意:n为 0 时表示球未开始下落。

输入样例:
33 5
输出样例:
94.9 1.0

// 皮球的初始高度和n
// 在第n次落地时,在空中一共经过多少距离?
// 第n次反弹的高度是多少?
// h h/2;h/2 h/2*(1/2)

#include <stdio.h>

int main(){
    double h,n;scanf("%lf %lf",&h,&n);
    double temp=h;
    double sum=0;
    if(n==0) printf("0.0 0.0");
    else{
        for(int i=1;i<=n;i++){ // 方法1.
            sum+=1.5*h;
            h/=2.0;
        }
        printf("%.1f %.1f",sum-h,h);
    
        // for(int i=1;i<=n-1;i++){ // 方法2.
        //     temp/=2.0;
        //     sum+=temp*2;
        // }
        // sum=sum+h;
        // printf("%.1f %.1f",sum,temp/2.0);
    }
    return 0;
}

7-60 打印菱形图案

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:
7
输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 
#include <stdio.h>

// 上半区 4行;空格为 3 2 1 0;图形为 1 3 5 7
// 下半区 3行;空格为 1 2 3;图形为 5 3 1
int main(){
    int n;scanf("%d",&n);
    int kg=n/2,tx=1;
    // 1.上半区
    for(int i=0;i<=n/2;i++){
        for(int j=0;j<kg;j++) printf("  ");
        for(int k=0;k<tx;k++) printf("* ");
        printf("\n");
        kg-=1;
        tx+=2;
    }
    // 2.下半区
    kg=1,tx=2*(n/2)-1;
    for(int i=0;i<n/2;i++){
        for(int j=0;j<kg;j++) printf("  ");
        for(int k=0;k<tx;k++) printf("* ");
        printf("\n");
        kg+=1;
        tx-=2;
    }
    return 0;
}

7-61 猴子吃桃问题

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。

输入样例:
3
输出样例:
10

// eat=x/2+1 
// eat=(x-eat)/2+1
// x-eat=1

// 从第二天开始,满足方程 x-(x/2+1)=昨天,即
// x=2*(昨天+1)

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);// 天数
    int sum=1;
    for(int i=2;i<=n;i++){
        sum=2*(sum+1);
    }
    printf("%d",sum);
    return 0;
}
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值