PTA-循环结构3

文章介绍了浙江大学C课程组提供的多个编程练习题目,涉及求奇数和、整数位数、最大公约数和最小公倍数、素数统计、猜数字游戏、兔子繁衍模型、高空坠球模拟、打印九九口诀、解决搬砖问题以及用格里高利公式计算PI值,展示了不同层次的数学与编程技能应用。
摘要由CSDN通过智能技术生成

7-1 求奇数和

作者 C课程组

单位 浙江大学

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

输入格式:

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

输出格式:

在一行中输出正整数序列中奇数的和。

输入样例:

8 7 4 3 70 5 6 101 -1

输出样例:

116

解答:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int sum=0;
    for(int i=1; ;i++)
    {
        cin>>i;
        if(i<=0)
            break;
        if(i%2==1)
        {
            sum=sum+i;
        }
    }
    cout<<sum<<endl;
    return 0;
}

7-2 求整数的位数及各位数字之和

作者 C课程组

单位 浙江大学

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:

输入在一行中给出一个不超过109的正整数N。

输出格式:

在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:

321

输出样例:

3 6

 解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int count=0;
    int sum=0;
    while(n>0)
    {
        count++;
        sum=sum+n%10;
        n=n/10;
    }
    cout<<count<<" "<<sum<<endl;
    return 0;
}

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

作者 张彤彧

单位 浙江大学

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

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n;
    cin>>m>>n;
    if(m>n)
    {
        int temp=m;
        m=n;
        n=temp;
    }
    int max,min;
    for(int i=n; ;i++)
    {
        if(i%n==0&&i%m==0)
        {
            max=i;
            break;
        }
    }
    for(int i=m;i>=1;i--)
    {
        if(m%i==0&&n%i==0)
        {
            min=i;
            break;
        }
    }
    cout<<min<<" "<<max<<endl;
    return 0;
}

7-4 统计素数并求和

作者 张彤彧

单位 浙江大学

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

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

 解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,i,j;
    cin>>m>>n;
    int count=0,sum=0;
    for(i=m;i<=n;i++)
    {
        for(j=2;j<i;j++)
        {
            if(i%j==0)
            {
                break;
            }
        }
        if(i==j)
        {
            count++;
            sum+=i;
        }
    }
    cout<<count<<" "<<sum<<endl;
    return 0;
}

7-5 猜数字游戏

作者 C课程组

单位 浙江大学

猜数字游戏是令游戏机随机产生一个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

解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int number,N,guess;
    cin>>number>>N;
    int count = 0;
    while(1)
    {
        cin>>guess;
        count++;
        if(count>N||guess<0)
        {
            cout<<"Game Over";
            break;
        }
        else if(guess==number)
        {
            if(count==1) cout<<"Bingo!";
            else if(count<=3) cout<<"Lucky You!";
            else if(count>3&&count<=N) cout<<"Good Guess!";
            break;
        }
        else 
        {
            if(guess>number) cout<<"Too big"<<endl;
            else cout<<"Too small"<<endl;
        }
    }
    return 0;
}

7-6 兔子繁衍问题

作者 徐镜春

单位 浙江大学

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30

输出样例:

9

 解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a=1,b=1;
    int c;
    int count=2;
    if(n==1)
    {
        cout<<"1"<<endl;
    }
    else
    {
        while(1)
        {
            c=a+b;
            a=b;
            b=c;
            count++;
            if(b>=n)
            {
                break;
            }
        }
    }
    cout<<count<<endl;
    return 0;
}

7-7 高空坠球

作者 C课程组

单位 浙江大学

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

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

注意:n为 0 时表示球未开始下落。

输入样例:

33 5

输出样例:

94.9 1.0

解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int h,n;
    scanf("%d %d",&h,&n);
    double sum = 0,height = 0;
    for(int i = 1;i<=n;i++)
    {
        if(i==1)
            sum = sum + h;
        else
            sum = sum + 2*height;
        height = h/pow(2,i);
    }
    printf("%.1f %.1f",sum,height);
    return 0;
}

7-8 打印九九口诀表

作者 徐镜春

单位 浙江大学

下面是一个完整的下三角九九口诀表:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

本题要求对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  

 解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int i=1,j=1;
    scanf("%d",&n);
    for (i=1; i<=n; i++) 
    {
        for (j=1; j<=i; j++)
        {
            printf("%d*%d=%-4d",j,i,i*j);
            if(i==j){ printf("\n");}
        }
    }
    return 0;
}
 

7-9 穷举问题-搬砖

分数 10

全屏浏览题目

切换布局

作者 杨起帆

单位 浙大城市学院

某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?

输入格式:

输入在一行中给出一个正整数n

输出格式:

输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c"的格式,输出男人的数量cnt_m,女人的数量cnt_w,小孩的数量cnt_c。请注意,等号的两侧各有一个空格,逗号的后面也有一个空格。

如果找不到符合条件的方案,则输出"None"

输入样例:

45

输出样例:

men = 0, women = 15, child = 30
men = 3, women = 10, child = 32
men = 6, women = 5, child = 34
men = 9, women = 0, child = 36

解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    int cnt_m = 0;
    int cnt_w = 0;
    float cnt_c = 0;
    int count = 0;
    for(cnt_m = 0;cnt_m<=n;cnt_m++)
    {
        for(cnt_w = 0;cnt_w<=n;cnt_w++)
        {
            for(cnt_c = 0;cnt_c<=n;cnt_c++)
            {
                if((cnt_m+cnt_w+cnt_c == n)&&(cnt_m*3+cnt_w*2+cnt_c*0.5==n))
                {
                    count++;
                    printf("men = %d, women = %d, child = %.0f\n",cnt_m,cnt_w,cnt_c);
                }
            }
        }
    }
    if(count == 0)
    {
        printf("None");
    }
    return 0;

7-10 用格里高利公式求给定精度的PI值

作者 颜晖

单位 浙大城市学院

本题要求编写程序,计算序列部分和 4∗(1−1/3+1/5−1/7+...) ,直到最后一项的绝对值小于给定精度eps

输入格式:

输入在一行中给出一个正实数eps

输出格式:

在一行中按照“Pi = pi”的格式输出部分和的值pi,精确到小数点后四位。题目保证输入数据和计算结果均不超过双精度范围。

输入样例1:

0.0001

输出样例1:

Pi = 3.1418

输入样例2:

0.2

输出样例2:

Pi = 2.8952

解答:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int denominator=1;
    double pi=0.0,flag=1.0;
    double eps,item=1.0;
    cin>>eps;
    if(eps<=1)
    {
        while(fabs(item)>=eps)
        {
            item = flag/denominator;
            pi = pi + item;
            flag = -flag;
            denominator = denominator + 2;
        }
        printf("Pi = %.4lf\n",pi*4);
    }
    else 
    {
        pi = 1;
        printf("Pi = %.4lf\n",pi*4);
    }
    return 0;

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值