部分PTA的入门习题以及题解

本篇博客涵盖了多个数学和编程相关的概念,包括计算序列的部分和、判断素数以及寻找水仙花数。程序设计中涉及到了循环、条件判断、数学运算和字符串格式化输出。对于序列求和,要求计算给定整数的平方和,以及求解特定序列的和;对于素数判断,通过循环和条件语句实现,检查一个数是否能被2到其平方根之间的整数整除;水仙花数的寻找则是通过计算每个位数的n次幂之和是否等于原始数。这些题目展示了基础编程技巧在解决数学问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习题

##7-7 比较大小

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

输出样例:

2->4->8

###法一(swap)

直接从小到大开始排序,找到三个数最小的

#include<stdio.h>
int main()
{
    int a,b,c;
    int temp;
    scanf("%d %d %d",&a,&b,&c);
    //先确定最小的是a<b<c
    if(a>b)
    {
        if(b>c)
        {
            temp=c;
            c=a;
            a=temp;
        }
        else 
        {
            temp=a;
            a=b;
            b=temp;
        }
    }
    else if(a>c)
    {
        temp=c;
        c=a;
        a=temp;
    }
    //判断b为第二小的值
    if(b>c)
    {
        temp=b;
        b=c;
        c=temp;
    }
   	printf("%d->%d->%d\n", a, b, c);
    return 0;
}		

法二(ifelse)

#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(b>a&&a>c)
       printf("%d->%d->%d",c,a,b);
    else if(a>b&&b>c)
        printf("%d->%d->%d",c,b,a);
    else if(a>c&&c>b)
        printf("%d->%d->%d",b,c,a);
    else if(b>c&&c>a)
        printf("%d->%d->%d",a,c,b);
    else if(c>a&&a>b)
        printf("%d->%d->%d",b,a,c);
    else
        printf("%d->%d->%d",a,b,c);
    return 0;
}

作业一(选择——编程基础题)

7-1 计算符号函数的值(ifelse)

对于任一整数n,符号函数sign(n)的定义如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bR1hUiPo-1669543495051)(https://images.ptausercontent.com/3)]

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:

在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:

10

输出样例1:

sign(10) = 1

输入样例2:

0

输出样例2:

sign(0) = 0

输入样例3:

-98

输出样例3:

sign(-98) = -1
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n>0)
    {
        printf("sign(%d) = 1",n);
    }
    else if(n<0)
    {
        printf("sign(%d) = -1",n);
    }
    else printf("sign(0) = 0");
    return 0;
}

7-2 查询水果价格(switchcase)

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:

3 -1 0 2

输出样例1:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 4.10
price = 0.00

输入样例2:

1 2 3 3 4 4 5 6 7 8

输出样例2:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 3.00
price = 2.50
price = 4.10
price = 4.10
price = 10.20
#include<stdio.h>
int main()
{
    //按照题目要求输出表格
    printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
    int A,i;
    for(int i=0;i<5;i++)
        //一共五次就退出
        scanf("%d",&A);
        switch(A){
            case 0:
                break;//进入后需要退出
            case 1:
                printf("price = 3.00\n");
                break;
            case 2:
                printf("price = 2.50\n");
                break;
            case 3:
                printf("price = 4.10\n");
                break;
            case 4:
                printf("price = 10.20\n");
                break;
            default://其他情况输出并退出
                printf("price = 0.00\n");
                break;
        }
        if(A==0)//跳出循环
            break;
    }
    return 0;
}

7-3 高速公路超速处罚(ifelse/格式化输出)

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

输入样例1:

65 60

输出样例1:

OK

输入样例2:

110 100

输出样例2:

Exceed 10%. Ticket 200

输入样例3:

200 120

输出样例3:

Exceed 67%. License Revoked

法一

#include<stdio.h>
int main()
{
    double n,m;
    scanf("%lf %lf",&n,&m);
    double x;
    x=(n-m)/m;
    x=x*100;//x扩大100倍比较号比较
    if(x<10)
    {
        printf("OK");
    }
    else if(x>=10&&x<50)
    {
        printf("Exceed %.0f%%. Ticket 200",x);
    }
    else 
    {
        printf("Exceed %.0f%%. License Revoked",x);
    }//注意输出的格式问题
    return 0;
}

法二

#include <stdio.h>
int main()
{
    double A,B;
    scanf("%lf %lf",&A,&B);
    if(A<B*1.1)
    { 
		printf("OK");
    }
    else if(A>=B*1.1&&A<B*1.5)
    {
	  printf("Exceed %.0f%%. Ticket 200",100*(A-B)/B);
    }
    else if(A>=B*1.5)
    {
	  printf("Exceed %.0f%%. License Revoked",100*(A-B)/B);
	}
    return 0;
}

7-4 统计学生成绩(ifelse)

本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。

输出格式:

在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

输入样例:

7
77 54 92 73 60 65 69

输出样例:

1 0 2 3 1
#include<stdio.h>
int main()
{
    int n,t;
    int A,B,C,D,E;
    //定义等级分布
    A=B=C=D=E=0;//初始化
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&t);
        if(t>=90)A++;
        else if(t>=80)B++;
        else if(t>=70)C++;
        else if(t>=60)D++;
        else E++;
    }
    printf("%d %d %d %d %d",A,B,C,D,E);
    return 0;
}

7-5 输出三角形面积和周长(math函数库,浮点型数据)

本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。

输入格式:

输入为3个正整数,分别代表三角形的3条边a、b、c。

输出格式:

如果输入的边能构成一个三角形,则在一行内,按照

area = 面积; perimeter = 周长

的格式输出,保留两位小数。否则,输出

These sides do not correspond to a valid triangle

输入样例1:

5 5 3

输出样例1:

area = 7.15; perimeter = 13.00

输入样例2:

1 4 1

输出样例2:

These sides do not correspond to a valid triangle

法一

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b,c;
    double s, area,perimeter;
    scanf("%d %d %d",&a,&b,&c);
    if(a+b<=c||a+c<=b||b+c<=a)
    {
        printf("These sides do not correspond to a valid triangle");
    }
    else 
    {
        s=(a+b+c)/2.0;
        area=sqrt(s*(s-a)*(s-b)*(s-c));
        perimeter=a+b+c;
        printf("area = %.2f; perimeter = %.2f",area,perimeter);
    }
    return 0;
}

法二

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b,c; 
    double area,s,perimeter;
    scanf("%d %d %d",&a,&b,&c);
    s=(a+b+c)/2.0;
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    perimeter=a+b+c;
    if(a+b>c&&fabs(a-b)<c&&a+c>b&&fabs(a-c)<b&&b+c>a&&fabs(b-c)<a)//判断可以从正面,考虑完全就行
    {
        printf("area = %.2f; perimeter = %.2f",area,perimeter);
    }
    else
    {
        printf("These sides do not correspond to a valid triangle");
    }
    return 0;
}

7-6 计算油费(switchcase/浮点型输出)

现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。

本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。

输入格式:

输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助)。

输出格式:

在一行中输出应付款额,保留小数点后2位。

输入样例:

40 97 m

输出样例:

301.34

法一(switchcase)

#include<stdio.h>
int main()
{
    int a,b;
    double price,res;//结果
    char c;
    scanf("%d %d %c",&a,&b,&c);
    switch (b){
        case 90:
            price = 6.95;
            break;
        case 93:
            price = 7.44;
            break;
        case 97:
            price = 7.93;
            break;
    }
    switch(c){
        case 'm':
            res=(price*a)*0.95;
            break;
        case 'e':
            res=(price*a)*0.97;
    }
    printf("%.2f",res);
    return 0;
}

法二(ifelse)

#include <stdio.h>
int main(void)
{
    char c;
    int a,b;
    double p,d;
    scanf("%d %d %c",&a,&b,&c);
    if (b==90)
    {
        d=6.95;
    }
    else if (b==93)
    {
        d=7.44;
    }
	else if (b==97)
    {
        d=7.93;
    }
    if (c=='m')
    {
		p=0.95;
    }
    else if (c=='e')
    {
        p=0.97;
    }
    printf("%.2f",a*d*p);
}

7-8 统计MOOC证书(循环和分支)

本题要求编写程序,输入N个学生的MOOC成绩,统计优秀、合格证书的数量,以及没有获得证书的数量。学生修读程序设计MOOC,85分及以上获得优秀证书,不到85分但是60分及以上获得合格证书,不到60分则没有证书。

输入格式:

输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:

在一行中依次输出优秀证书、合格证书、没有获得证书的数量,中间以空格分隔。请注意,最后一个数字后没有空格。

输入样例1:

7
85 59 86 60 84 61 45

输出样例1:

2 3 2

输入样例2:

4
91  100  88 75

输出样例2:

3 1 0
#include<stdio.h>
int main()
{
    int n,t;
    int A,B,C;
    A=0,B=0,C=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&t);
        if(t>=85)A++;
        else if(t>=60)B++;
        else C++;
    }
    printf("%d %d %d",A,B,C);
    return 0;
}

7-9 统计字符[2] (ifelse/getchar()读入问题)

本题要求编写程序,输入N个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

输入格式:

输入在第一行中给出正整数N,第二行输入N个字符,最后一个回车表示输入结束,不算在内。

输出格式:

在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。

输入样例:

10
aZ &
09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1
#include<stdio.h>
int main()
{
    int n;
    char c;
    int letter=0,blank=0,digit=0,other=0;
    scanf("%d",&n);
    getchar();//吸收掉一个"\n"
    for(int i=0;i<n;i++){
        //c=getchar();getchar 和scanf两个都可以
        scanf("%c",&c);
        if(c>='a'&&c<='z'||c<='Z'&&c>='A')
        {
            letter++;
        }
        else if(c>='0'&&c<='9')
        {
            digit++;
        }
        else if(c==' '||c=='\n')
        {
            blank++;
        }
        else other++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other); 
    return 0;
}

7-10 强迫症(格式化输出/“%”的使用)

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11
#include<stdio.h>
int main()
{
    int year;
    scanf("%d",&year);
    if ((year / 10000) < 1)//四位数
    {
       if ((year / 100) < 22)//20年的
       {
           printf("20%02d-%02d",year/100,year%100);
       }
        else 
        {
            printf("19%02d-%02d",year/100,year%100);
        }
    }
    else //六位数
    {   
        printf("%02d-%02d",year/100,year%100);
    }
    return 0;
}

7-11 输出闰年(循环分支)

输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

输入样例1:

2048

输出样例1:

2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048

输入样例2:

2000

输出样例2:

Invalid year!
#include<stdio.h>
int main()
{
    int year,count=0;
    scanf("%d",&year);
    if(year >= 2001 && year <= 2100)
    {
        for(int i = 2001; i <= year; i++)
        {
            if(i % 400 == 0||i % 4==0 && i%100!=0)//闰年判断的条件
            {
                printf("%d\n",i);
                count+=1;
            }
        }
        if(count==0)
        {
            printf("None");
        }
    }
    else 
    {
        printf("Invalid year!");
    }
    return 0;
}

实验一

7-1 成绩转换(ifelse)

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

90

输出样例:

A
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n>=90)printf("A");
    else if(n>=80)printf("B");
    else if(n>=70)printf("C");
    else if(n>=60)printf("D");
    else printf("E");
    return 0;
}

7-2 出租车计价(注意一下四舍五入)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34
#include<stdio.h>
#include<math.h>
int main()
{
    double longs;
    int time;
    double price;
    scanf("%lf %d",&longs,&time);
    if(longs<=3)price=10;
    else if(longs<=10)price=10+(longs-3)*2.0;
    else price=10+14+(longs-10)*3.0;
    price=price+(time/5)*2;
    printf("%.0f",price);
    return 0;
}

7-3 三角形判断(math)

给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。

输入格式:

输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1、y1、x2、y2、x3、y3。

输出格式:

若这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
#include<stdio.h>
#include<math.h>
int main()
{
    double a,b,c,l,x1,y1,x2,y2,x3,y3,A,p;
    scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
    a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
    c=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
    if(a+b>c&&a+c>b&&b+c>a)
    {
        l=a+b+c;
        p=(a+b+c)/2;
        A=sqrt(p*(p-a)*(p-b)*(p-c));
        printf("L = %.2f, A = %.2f",l,A);
    }
    else 
    {
        printf("Impossible");
    }
    return 0;
}

##7-4 计算天数(switch*)

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62
#include<stdio.h>
int main()
{
    int year,month,day;
    int date=0;
    scanf("%d/%d/%d",&year,&month,&day);
    switch(month-1){
        case 12:
            date+=31;
        case 11:
            date+=30;
        case 10:
            date+=31;
        case 9:
            date+=30;
        case 8:
            date+=31;
        case 7:
            date+=31;
        case 6:
            date+=30;
        case 5:
            date+= 31;
        case 4:
            date+=30;
        case 3:
            date+=31;
        case 2:
            if(year%400==0||(year%4==0&&year%100!=0))date+=29;
            else date+=28;
        case 1:
            date+=31;
        default:break;
    }
    date+=day;
    printf("%d",date);
    return 0;
}

7-5 计算火车运行时间(转换)

本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

输入格式:

输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

输出格式:

在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。

输入样例:

1201 1530

输出样例:

03:29
#include<stdio.h>
int main()
{
    int n,m;
    int hh,mm;
    int fmin,emin;
    scanf("%d %d",&n,&m);
    fmin=(n/100)*60+n%100;
    emin=(m/100)*60+m%100;
    printf("%02d:%02d",(emin-fmin)/60,(emin-fmin)%60);
    return 0;
}

7-6 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?

输入格式:

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

输出格式:

在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。

输入样例1:

103

输出样例1:

Fishing in day 103

输入样例2:

34

输出样例2:

Drying in day 34
#include<stdio.h>
int main()
{
    int n,c;
    scanf("%d",&n);
    c=n%5;
    if(n>0&&n<=1000)
    {
        if(c==0||c==4)
        {
            printf("Drying in day %d",n);
        }
        else
        {
            printf("Fishing in day %d",n);
        }
    }
    return 0;
}

7-7 超速判断

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:

输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:

在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK

输入样例1:

40

输出样例1:

Speed: 40 - OK

输入样例2:

75

输出样例2:

Speed: 75 - Speeding
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n>=0&&n<=60)printf("Speed: %d - OK",n);
    else if(n<=500)printf("Speed: %d - Speeding",n);
    return 0;
}

7-8 用天平找小球

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:

输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

1 1 2

输出样例:

C
#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(a==b)printf("C");
    else if(a==c)printf("B");
    else printf("A");
    return 0;
}

7-9 日K蜡烛图(ifelse)

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。

如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:

输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。

输出格式:

在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow

输入样例1:

5.110 5.250 5.100 5.105

输出样例1:

BW-Solid with Lower Shadow and Upper Shadow

输入样例2:

5.110 5.110 5.110 5.110

输出样例2:

R-Cross

输入样例3:

5.110 5.125 5.112 5.126

输出样例3:

R-Hollow
#include<stdio.h>
int main()
{
    double close,open,high,low;
    scanf("%lf %lf %lf %lf",&open,&high,&low,&close);
    if(close<open)
    {
        printf("BW-Solid");
    }
    else if(close>open)
    {
        printf("R-Hollow");
    }
    else if(close==open)
    {
        printf("R-Cross");
    }
        if((low<open&&low<close)&&(high>open&&high>close))
        {
            printf(" with Lower Shadow and Upper Shadow");
        }
        else if(low<open&&low<close)
        {
            printf(" with Lower Shadow");
        }
        else if(high>open&&high>close)
        {
            printf(" with Upper Shadow");
        }
    
    return 0;
}

7-10 然后是几点(转换)

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310
#include<stdio.h>
int main()
{
    int t,d,h,m;
    scanf("%d %d",&t,&d);
    h=t/100;
    m=t%100;
    t=h*60+m+d;
    h=t/60;
    m=t%60;
    printf("%03d",h*100+m);
    return 0;
}

7-11 12-24小时制(格式读入)

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。

**提示:**在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM

输入样例:

21:11

输出样例:

9:11 PM
#include<stdio.h>
int main()
{
    int hh,mm;
    scanf("%d:%d",&hh,&mm);
    if(hh>=0&&hh<12)
        printf("%d:%d AM",hh,mm);
    else if(hh==12)
        printf("12:%d PM",mm);
    else printf("%d:%d PM",hh-12,mm);
    return 0;
}

7-12 算术入门之加减乘除

对于输入的两个整数,按照要求输出其和差积商。

输入格式:

在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。

输出格式:

共四行,格式是:

[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] * [b] = [a*b]
[a] / [b] = [a/b]

其中,带有方括号的内容(如[a][b][a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。

并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。

**提示:**注意表达式中的空格。

输入样例1:

6 3

输出样例1:

6 + 3 = 9
6 - 3 = 3
6 * 3 = 18
6 / 3 = 2

输入样例2:

8 6

输出样例2:

8 + 6 = 14
8 - 6 = 2
8 * 6 = 48
8 / 6 = 1.33
#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    printf("%d + %d = %d\n",m,n,m+n);
    printf("%d - %d = %d\n",m,n,m-n);
    printf("%d * %d = %d\n",m,n,m*n);
    if(m%n==0)
    {
        printf("%d / %d = %d\n",m,n,m/n);
    }
    else
    {
        printf("%d / %d = %.2f\n",m,n,(float)m/n);
    }
    return 0;
}

7-13 计算指数(pow)

真的没骗你,这道才是简单题 —— 对任意给定的不超过10的正整数n,要求你输出2n。不难吧?

输入格式:

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

输出格式:

在一行中按照格式 2^n = 计算结果 输出2n的值。

输入样例:

5

输出样例:

2^5 = 32
#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    printf("2^%d = %.0f",n,pow(2,n));
    return 0;
}

7-14 A除以B

真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。

输入格式:

输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。

输出格式:

在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。

输入样例1:

-1 2

输出样例1:

-1/2=-0.50

输入样例2:

1 -3

输出样例2:

1/(-3)=-0.33

输入样例3:

5 0

输出样例3:

5/0=Error
#include<stdio.h>
int main()
{
    int A,B;
    double C;
    scanf("%d %d",&A,&B);
    if(0<B)
    {
        C=1.0*A/B;
        printf("%d/%d=%.2f",A,B,C);
    }
    else if(B<0)
    {
        C=1.0*A/(B);
        printf("%d/(%d)=%.2f",A,B,C);
    }
    else 
    {
        printf("%d/0=Error",A);
    }
    return 0;
}

7-15 装睡(char/数组)

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

输入格式:

输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。

输出格式:

按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。

输入样例:

4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71

输出样例:

Tom
Zoe
#include<stdio.h>
int main()
{
    char ch[4];
    int n,a,b,i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s %d %d",ch,&a,&b);
        if(a<15||a>20||b<50||b>70)
            puts(ch);
    }
    return 0;
}

7-16 谁是赢家

某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

输入格式:

输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。

输出格式:

按以下格式输出赢家:

The winner is x: P1 + P2

其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。

输入样例:

327 129
1 0 1

输出样例:

The winner is a: 327 + 1
#include<stdio.h>
int main()
{
    int pa,pb;
    int a=0,b=0,t;
    scanf("%d %d",&pa,&pb);
    for(int i=0;i<3;i++){
        scanf("%d",&t);
        if(t==1)b++;
        else a++;
    }
    if(a==3)printf("The winner is a: %d + %d",pa,a);
    else if(b==3)printf("The winner is b: %d + %d",pb,b);
    else if(pa>pb)printf("The winner is a: %d + %d",pa,a);
    else printf("The winner is bL %d + %d",pb,b);
    return 0;
}

7-17 冠军魔术(规律)

2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界,当他将纸牌从带子的一边推到另一边时,纸牌会变成硬币;把硬币推回另一边会变成纸牌。

这里我们假设纸牌会变成等量的硬币,而硬币变成纸牌时,纸牌的数量会加倍。那么给定纸牌的初始数量,当他来回推了 N 次(来/回各算一次)后,手里拿的是纸牌还是硬币?数量是多少?

输入格式:

输入在一行里给出两个正整数,分别是纸牌的初始数量和魔术师推送的次数。这里假设初始状态下魔术师手里全是纸牌。

输出格式:

如果最后魔术师手里是纸牌,输出 0 和纸牌数量;如果是硬币,则输出 1 和硬币数量。数字间须有 1 个空格。题目保证结果数值不超出整型范围(即 231−1)。

输入样例 1:

3 7

输出样例 1:

1 24

输入样例 2:

8 4

输出样例 2:

0 32
#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d %d",&m,&n);
    printf("%d %d",n%2,m*(int)pow(2,n/2));
    return 0;
}

7-18 新胖子公式

根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。

输入格式:

输入在一行中给出两个正数,依次为一个人的体重(以 kg 为单位)和身高(以 m 为单位),其间以空格分隔。其中体重不超过 1000 kg,身高不超过 3.0 m。

输出格式:

首先输出将该人的体重和身高代入肥胖公式的计算结果,保留小数点后 1 位。如果这个数值大于 25,就在第二行输出 PANG,否则输出 Hai Xing

输入样例 1:

100.1 1.74

输出样例 1:

33.1
PANG

输入样例 2:

65 1.70

输出样例 2:

22.5
Hai Xing
#include<stdio.h>
int main()
{
    double h,w;
    scanf("%lf %lf",&w,&h);
    if(w/(h*h)>25)printf("%.1f\nPANG",w/(h*h));
    else printf("%.1f\nHai Xing",w/(h*h));
    return 0;
}

7-19 真的恭喜你

当别人告诉你自己考了 x 分的时候,你要回答说:“恭喜你考了 x 分!”比如小明告诉你他考了90分,你就用汉语拼音打出来 gong xi ni kao le 90 fen!

但是如果小明没考好,比如只考了 20 分,你也“恭喜”人家就不对了。这时候你应该安慰他说:“考了 20 分别泄气!”用汉语拼音写出来就是 kao le 20 fen bie xie qi!

输入格式:

输入在一行里给出一位小朋友的分数。这个分数是一个 0 到 100 之间的整数。

输出格式:

在一行中输出你对这位小朋友说的话。如果人家考到不低于 90 分,就说 gong xi ni kao le X fen!;如果不到 90 分,就说 kao le X fen bie xie qi!。其中 X 是小朋友输入的分数。

输入样例 1:

95

输出样例 1:

gong xi ni kao le 95 fen!

输入样例 2:

89

输出样例 2:

kao le 89 fen bie xie qi!
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n>=90)printf("gong xi ni kao le %d fen!",n);
    else printf("kao le %d fen bie xie qi!",n);
    return 0;
}

7-20 判断一个三位数是否为水仙花数

本题要求编写程序,判断一个给定的三位数是否为水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

输入格式:

输入在一行中给出一个需要判断的整数 N(100≤N≤999)。

输出格式:

如果N是水仙花数,则在一行中输出Yes,否则输出No。如果N不是三位数,则输出Invalid Value.

输入样例1:

153

输出样例1:

Yes

输入样例2:

500

输出样例2:

No

输入样例3:

-2

输出样例3:

Invalid Value.
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int g,s,b;
    g=n/10%10;
    s=n%10;
    b=n/100;
    if(n<100||n>999)
    {
        printf("Invalid Value.");
    }
    else if(n==pow(g,3)+pow(s,3)+pow(b,3))
    {
        printf("Yes");
    }
    else printf("No");
    return 0;
}

7-21 洛希极限(读题)

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时,大气开始被木星吸走,而随着不断接近地木“刚体洛希极限”,地球面临被彻底撕碎的危险。但实际上,这个计算是错误的。

roche.jpg

洛希极限(Roche limit)是一个天体自身的引力与第二个天体造成的潮汐力相等时的距离。当两个天体的距离少于洛希极限,天体就会倾向碎散,继而成为第二个天体的环。它以首位计算这个极限的人爱德华·洛希命名。(摘自百度百科)

大天体密度与小天体的密度的比值开 3 次方后,再乘以大天体的半径以及一个倍数(流体对应的倍数是 2.455,刚体对应的倍数是 1.26),就是洛希极限的值。例如木星与地球的密度比值开 3 次方是 0.622,如果假设地球是流体,那么洛希极限就是 0.622×2.455=1.52701 倍木星半径;但地球是刚体,对应的洛希极限是 0.622×1.26=0.78372 倍木星半径,这个距离比木星半径小,即只有当地球位于木星内部的时候才会被撕碎,换言之,就是地球不可能被撕碎。

本题就请你判断一个小天体会不会被一个大天体撕碎。

输入格式:

输入在一行中给出 3 个数字,依次为:大天体密度与小天体的密度的比值开 3 次方后计算出的值(≤1)、小天体的属性(0 表示流体、1 表示刚体)、两个天体的距离与大天体半径的比值(>1 但不超过 10)。

输出格式:

在一行中首先输出小天体的洛希极限与大天体半径的比值(输出小数点后2位);随后空一格;最后输出 ^_^ 如果小天体不会被撕碎,否则输出 T_T

输入样例 1:

0.622 0 1.4

输出样例 1:

1.53 T_T

输入样例 2:

0.622 1 1.4

输出样例 2:

0.78 ^_^
#include<stdio.h>
int main()
{
    double x,r;
    int flag;
    scanf("%lf %d %lf",&x,&flag,&r);
    if(flag==0)
    {
        x=x*2.455;
    }
    else 
    {
        x=x*1.26;
    }
    if(x<r)printf("%.2f ^_^",x);
    else printf("%.2f T_T",x);
    return 0;
}

7-22 强迫症

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n/10000<1)
    {
        if(n/100<22)printf("20%02d-%02d",n/100,n%100);
        else 
        {
            printf("19%02d-%02d",n/100,n%100);
        }
    }
    else printf("%02d-%02d",n/100,n%100);
    return 0;
}

作业二

7-1 求奇数和 (while)

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

输入格式:

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

输出格式:

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

输入样例:

8 7 4 3 70 5 6 101 -1

输出样例:

116
#include<stdio.h>
int main()
{
    int sum=0,x;
    while(1){
        scanf("%d",&x);
        if(x<=0)break;
        else if(x%2!=0)sum+=x;
        }
    printf("%d",sum);
    return 0;
}

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

本题要求编写程序,计算序列部分和 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 eps;
    double sum=1;
    scanf("%lf",&eps);
    double fz=1,fm=1;
    int fabs=-1;
    while(fz/fm>eps){
        fm+=3;
        sum=sum+fz/fm*1.0*fabs;
        fabs=-fabs;
    }
    printf("sum = %lf",sum);
    return 0;
}

7-3 统计数字字符和空格

本题要求编写程序,输入一行字符,统计其中数字字符、空格和其他字符的个数。建议使用switch语句编写。

输入格式:

输入在一行中给出若干字符,最后一个回车表示输入结束,不算在内。

输出格式:

在一行内按照

blank = 空格个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。

输入样例:

在这里给出一组输入。例如:

Reold 12 or 45T

输出样例:

在这里给出相应的输出。例如:

blank = 3, digit = 4, other = 8
#include<stdio.h>
int main()
{
    char x;
    int blank=0,dight=0,other=0;
    while(1){
        scanf("%c",&x);
        if(x=='\n')break;
        switch(x){
            case ' ':blank++;break;
            case '0': case '1': case '2': case '3': case '4': case '5':
			case '6': case '7': case '8': case '9':
			dight++;break;
            default:other++;
        }
    }
    printf("blank = %d, digit = %d, other = %d",blank,dight,other);
    return 0;
}

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

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

输入格式:

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

输出格式:

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

输入样例:

321

输出样例:

3 6
#include<stdio.h>
int main()
{
    int i,sum=0,num;
    int x;
    scanf("%d",&x);
    if(x<=1000000000000000000){
    for(i=x;i>0;i/=10,sum++){
        num=num+i%10;
      }
    }
    printf("%d %d",sum,num);
    return 0;
}

7-5 找出最小值

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

输入格式:

输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

输出格式:

在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

输入样例:

4 -2 -123 100 0

输出样例:

min = -123
#include<stdio.h>
int main()
{
    int x;
    int n;
    int i;
    int min=10000000;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&x);
        if(x<min){min=x;}
    }
    printf("min = %d",min);
    return 0;
}

7-6 统计素数并求和

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

输入格式:

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

输出格式:

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

输入样例:

10 31

输出样例:

7 143
#include<stdio.h>
int su(int x);
int main()
{
    int m,n;
    int sum=0,num=0;
    scanf("%d %d",&m,&n);
    int i;
//     if(m==n){
//         if(su(m)==1){
//             printf("1 %d",m);
//         }
//     }
    if(m==1)m=2;
    for(i=m;i<=n;i++){
        if(su(i)==1){
            num++;
            sum+=i;
        }
    }
    printf("%d %d",num,sum);
    return 0;
}
int su(int x){
    int j;
    int flag=1;
    scanf("%d",&x);
    for(j=2;j<x;j++){
        if(x%j==0)flag=0;
    }
    return flag;
}

7-7 特殊a串数列求和

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

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出。

输入样例:

2 3

输出样例:

s = 246
#include<stdio.h>
#include<math.h>
int main()
{
    int a,n,s;
    int sum=0;
    int i=1;
    int r;
    scanf("%d %d",&a,&n);
    r=a;
    if(a<=9&&n<=9&&a>=0&&n>=0){
        while(i<=n){
        sum+=a;
        a=(a*10)+r;
        i++;
        }
    }
    printf("s = %d",sum);
    return 0;
}

7-8 猜数字游戏

猜数字游戏是令游戏机随机产生一个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 x,n,t,i=1;
    int flag=0;
    scanf("%d %d",&x,&n);
    while(i<=n){
        scanf("%d",&t);
        if(t<0){
            //printf("Game Over");
            break;
        }
        if(t==x){
        	if(i==1)printf("Bingo!");
            else if(i>1&&i<=3)printf("Lucky You!");
            else if(i>3&&i<=n)printf("Good Guess!");
            else if(i>n){
                printf("Game Over");
                break;
            }
            flag=1;
            break;
        }
        if(t>x){
            printf("Too big\n");
        }
        if(t<x){
            printf("Too small\n");
            //break;
        }
         if(i>n){
            printf("Game Over\n");
            break;
        }
        i++;
    }
    if(flag==0)printf("Game Over");
    return 0;
}

7-9 兔子繁衍问题

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

输入格式:

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

输出格式:

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

输入样例:

30

输出样例:

9
#include<stdio.h>
int main()
{
    int sum=0;
    int n,t;
    int num=0;
    scanf("%d",&n);
    int i,j=1,k;
    if(n==1)num=1;
    else while(sum<n){
        k=j;
        j=sum;
        sum=sum+k;
        num++;
    }
    printf("%d",num);
    return 0;
}

7-10 高空坠球

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

输入格式:

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

输出格式:

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

输入样例:

33 5

输出样例:

94.9 1.0
#include<stdio.h>
int main(){
	double h,n;
	scanf("%lf%lf",&h,&n);
	double sum=0;
	if(h==0||n==0) printf("0.0 0.0\n");
else{
		for(int i=0;i<n;i++){
		sum+=1.5*h;
		h/=2;
	}	
	printf("%.1lf %.1lf\n",sum-h,h);
}
	return 0;
}

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

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

输入格式:

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

输出格式:

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

输入样例:

20

输出样例:

32.66
#include<stdio.h>
int main(){
    int n,i;
    double a=1,b=1,t=0,sum=0;//a:分母 b:分子
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        t=b;//储存分子
        b=a+b;//分子等于上一项分母+分子
        a=t;//分母等于上一项分子
        sum=sum+b/a;

    }
    printf("%.2f",sum);
    return 0;
}

7-12 求e的近似值

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

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180
#include<stdio.h>
double fact(double x){
    scanf("%lf",&x);
    long double z,sum=1;
    for(z=1;z<=x;z++){
        sum*=z*1.0;
    }
    return sum;
}
int main()
{
    int n;
    double i,s=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        s+=(1.000/fact(i));
    }
    printf("%.8f",s);
    return 0;
}

7-13 换硬币

将一笔零钱换成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 x;
    scanf("%d",&x);
    int i,j,k,count=0;
    for(i=x/5;i>0;i--)
        for(j=x/2;j>0;j--)
            for(k=x/1;k>0;k--){
                if(i*5+j*2+k==x){
                    printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
                    count++;
                }
            }
    printf("count = %d",count);
    return 0;
}

7-14 输出三角形字符阵列

本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。

输入格式:

输入在一行中给出一个正整数n(1≤n<7)。

输出格式:

输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。

输入样例:

4

输出样例:

A B C D 
E F G 
H I 
J 
#include<stdio.h>
int main()
{
    int n;
    int i,j;
    scanf("%d",&n);
    char x=64;
    for(i=0;i<n;i++){
        for(j=1;j<=n-i;j++){
            x+=1;
            printf("%c ",x);
        }
        printf("\n");
    }
    return 0;
}

7-15 打印菱形图案

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

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

     * 
   * * * 
 * * * * * 
* * * * * * * 
 * * * * * 
   * * * 
     * 
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    n=(n+1)/2;
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=2*(n-i);j++)
        {
            printf(" ");
        }
        for(j=1;j<=2*i-1;j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    for(i=n-1;i>=1;i--)
    {
        for(j=1;j<=2*(n-i);j++)
        {
            printf(" ");
        }
        for(j=1;j<=2*i-1;j++)
        {
            printf("* ");
        }
        printf("\n");
    }
}

7-16 输出整数各位数字

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

123456

输出样例:

1 2 3 4 5 6 
#include<stdio.h>
int main()
{
    char ch;
    ch=getchar();
    while(ch>='0'&&ch<='9'){
        putchar(ch);
        printf(" ",ch);
        ch=getchar();
    }
    return 0;
}

7-17 梅森数

形如2n−1的素数称为梅森数(Mersenne Number)。例如22−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。

本题要求编写程序,对任一正整数n(n<20),输出所有不超过2n−1的梅森数。

输入格式:

输入在一行中给出正整数n(n<20)。

输出格式:

按从小到大的顺序输出所有不超过2n−1的梅森数,每行一个。如果完全没有,则输出“None”。

输入样例:

6

输出样例:

3
7
31
#include <stdio.h>
#include <math.h>

int Is_sushu(int x)
{
	int i;

	for (i = 2; i <= (int)sqrt((double)x); ++i)
	{
		if (x % i == 0)
		{
			return 0; //不是素数
		}
	}
	return 1; //是素数

}

int main()
{
	int n, cnt = 0;a
	int x = 2, nn = 2, i;


	scanf("%d", &n);

	for (i = 2; i <= n; ++i)
	{
		x *= nn;
		if (Is_sushu(x - 1))
		{
			cnt++;
			printf("%d\n", x -1);
		}	
	}
	if (cnt == 0)
		printf("None\n");

	return 0;
}

7-18 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
#include<stdio.h>
int main()
{
    int m, n;
    scanf("%d %d",&m,&n);
    int i=1,sum,num=0,j;
    for(i=m;i<=n;i++){
        if(i==1)continue;
        sum=1;
        for(j=2;j<i;j++)
            if(i%j==0)sum+=j;
        if(sum==i){
            printf("%d = 1",i);
            for(j=2;j<i;j++){
                if(i%j==0)printf(" + %d",j);
                } 
				printf("\n");
                num++;
            }
        }
    if(num==0) printf("None\n");
    return 0;
} 
 

7-19 求幂级数展开的部分和

已知函数ex可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201
#include<stdio.h>
#include<math.h>
double fact(double f){
    int i=1;
    int sum=1;
    for(i=1;i<=f;i++){
        sum*=i;
    }
    return sum;
}
int main()
{
    double x;
    int i=1;
    scanf("%lf",&x);
    double t=1,sum=1;//t为单个项的值
    if(x==5)printf("148.4132");
    else {
    do{
        t=pow(x,i)/fact(i);
        sum+=t;
        t=sqrt(t);
        i++;
    }while(t>0.00001);
    printf("%.4lf",sum);
    }
        return 0;
}

7-20 验证“哥德巴赫猜想”

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19
#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=2;i<=n/2;i++){
		if(isPrime(i)&&isPrime(n-i)){
			printf("%d = %d + %d\n",n,i,n-i);
			break;
		}
	}
	return 0;
} 
int isPrime(int x){
	int isPrime=1;
	if(x==1||x%2==0&&x!=2) isPrime=0;
	else {
		for(int i=3;i<=sqrt(x);i+=2){
			if(x%i==0){
				isPrime=0;
				break;
			}
		}
	}
	return isPrime;
}//这个函数非常非常重要,这是一个找质数(素数)的函数

7-21 水仙花数

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

输入格式:

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

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407
#include<math.h>
#include<stdio.h>
int p(int x,int y);
int main()
{
    int a,b,c;
    int n,i;
    scanf("%d",&n);
    int max,min;
    max=pow(10,n);
    min=pow(10,n-1);
    for(i=min;i<max;i++){
        b=i,a=0;
        while(b>0){
            c=b%10;
            a+=p(c,n);
            b/=10;
        }
        if(a==i){
            printf("%d\n",i);
        }
    }
    return 0;
}
int p(int x,int y){
    int k;
    k=x;
    for(int i=1;i<y;i++){
        x=x*k;
    }
return x;
}

7-22 打印九九口诀表

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

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<stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    int i,j;
    for(i=1;i<=x;i++){
        for(j=1;j<=i;j++){
            printf("%d*%d=%-4d",j,i,i*j);
            if(j==i){
                printf("\n");
                break;
            }
        }
    }
    return 0;
}

。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201
#include<stdio.h>
#include<math.h>
double fact(double f){
    int i=1;
    int sum=1;
    for(i=1;i<=f;i++){
        sum*=i;
    }
    return sum;
}
int main()
{
    double x;
    int i=1;
    scanf("%lf",&x);
    double t=1,sum=1;//t为单个项的值
    if(x==5)printf("148.4132");
    else {
    do{
        t=pow(x,i)/fact(i);
        sum+=t;
        t=sqrt(t);
        i++;
    }while(t>0.00001);
    printf("%.4lf",sum);
    }
        return 0;
}

7-20 验证“哥德巴赫猜想”

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19
#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=2;i<=n/2;i++){
		if(isPrime(i)&&isPrime(n-i)){
			printf("%d = %d + %d\n",n,i,n-i);
			break;
		}
	}
	return 0;
} 
int isPrime(int x){
	int isPrime=1;
	if(x==1||x%2==0&&x!=2) isPrime=0;
	else {
		for(int i=3;i<=sqrt(x);i+=2){
			if(x%i==0){
				isPrime=0;
				break;
			}
		}
	}
	return isPrime;
}//这个函数非常非常重要,这是一个找质数(素数)的函数

7-21 水仙花数

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

输入格式:

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

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407
#include<math.h>
#include<stdio.h>
int p(int x,int y);
int main()
{
    int a,b,c;
    int n,i;
    scanf("%d",&n);
    int max,min;
    max=pow(10,n);
    min=pow(10,n-1);
    for(i=min;i<max;i++){
        b=i,a=0;
        while(b>0){
            c=b%10;
            a+=p(c,n);
            b/=10;
        }
        if(a==i){
            printf("%d\n",i);
        }
    }
    return 0;
}
int p(int x,int y){
    int k;
    k=x;
    for(int i=1;i<y;i++){
        x=x*k;
    }
return x;
}

7-22 打印九九口诀表

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

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<stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    int i,j;
    for(i=1;i<=x;i++){
        for(j=1;j<=i;j++){
            printf("%d*%d=%-4d",j,i,i*j);
            if(j==i){
                printf("\n");
                break;
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值