习题
##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 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*1
到N*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*1
到N*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;
}