浙大MOOC翁恺C语言程序设计课后习题

中国大学MOOC-翁恺-C语言程序设计习题集(学习笔记)

02-2. 然后是几点(15)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:

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

输出格式:

输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

输入样例:
1120 110
输出样例:
1310

#include<stdio.h>

int main(int argc, const char * argv[])
{
int time,add,hour,minute,hour1, minute1,a,b;

scanf("%d %d",&time,&add);

hour=time/100;
minute=time%100;
minute1=hour*60+minute+add;

hour1=minute1/60;
b=minute1%60;
a=hour1*100+b;
printf("%d",a);

}

03-1. 三天打鱼两天晒网(15)

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

输入格式:

输入在一行中给出1个不超过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;
scanf("%d", &n);

int t = n%5;
	if (t>=1 && t<=3){
	printf("Fishing in day %d\n", n);
} else{
	printf("Drying in day %d\n", n);
}
return 0;

}
03-3. 12-24小时制(15)
编写一个程序,要求用户输入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 argc, const char * argv[])

{

int m,n;

scanf("%d:%d",&m,&n);

if (m>=0 && m<12) {

    printf("%d:%d AM\n",m,n);

}

else if (m==12){

    printf("%d:%d PM\n",m,n);

}

else if (m>12 && m<=24){  

    printf("%d:%d PM\n",m%12,n);

}

}

03-4. 成绩转换(15)
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:

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

输出格式:

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

输入样例:
90
输出样例:
A

#include <stdio.h>

int main()
{
int score;
scanf("%d",&score);
score /= 10;
switch (score){
case 10:
case 9:
printf(“A”);
break;
case 8:
printf(“B”);
break;
case 7:
printf(“C”);
break;
case 6:
printf(“D”);
break;
default:
printf(“E”);
}

return 0;

}

04-0. 求符合给定条件的整数集(15)

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

#include<stdio.h> // 第一种算法

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

int i, j, k;
int count = 0;
for (i=n; i<=n+3; i++) {
    for (j=n; j<=n+3; j++) {
        if ( j == i ) continue;
        for (k=n; k<=n+3; k++) {
            if ( k==i || k==j) continue;
            printf("%d%d%d", i, j, k);
            count ++;
            if (count % 6 == 0) {
                printf("\n");
            } else {
                printf(" ");
            }
        }
    }
}
 
return 0;

}

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

输入格式:

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

输出格式:

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

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

#include<stdio.h>

int main(int argc, const char * argv[])
{ int n,i,first;
scanf("%d",&n);
i=1;first=1;
while(i<n){
first *=10;
i++;
}

i=first;
while(i<first*10){
	
	int t=i;
	int sum=0;
	do{
		int d=t%10;
		t/=10;
		int p=d;
		int j=1;
		while(j<n){
			p*=d;
			j++;
		}
		sum+=p;
	}while(t>0);
	if(sum==i){
		printf("%d\n",i);
	}
	i++;
	 
}
 
return 0;

}

04-2. 打印九九口诀表(15)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
徐镜春(浙江大学)
下面是一个完整的下三角九九口诀表:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
1
6=6 26=12 36=18 46=24 56=30 66=36
1
7=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 99=81
本题要求对任意给定的1位正整数N,输出从1
1到N*N的部分口诀表。

输入格式:

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

输出格式:

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

输入样例:
4
输出样例:
11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16

#include<stdio.h>

int main(int argc, const char * argv[])
{ int n,i,j;
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;

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

输入格式:

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

输出格式:

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

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

#include<stdio.h>

int main(int argc, const char * argv[])
{ int n,m,i,j;
int sum=0,cut=0;
scanf("%d %d",&m,&n);
if(m==1){
m=2;
}

	for(i=m;i<=n;i++){
	
		for(j=2;j<=i;j++)
		{	
				if(i%j==0) break;
	}if(j==i){
			sum+=i;
			cut++;
	}
		}		
		printf("%d %d",cut,sum);
	
	 	return 0;

}

猜数字游戏(15)

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

输入格式:

输入第一行中给出2个不超过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 rand_number, n;
scanf("%d %d", &rand_number, &n);
int i;
int m;
int flag = 0;
for (i = 1; i <= n; i++)
{
scanf("%d", &m);
if (m < 0)
break;
if (m > rand_number)
printf(“Too big\n”);
if (m < rand_number)
printf(“Too small\n”);
if (m == rand_number)
{
if (i == 1)
{
flag = 1;
printf(“Bingo!\n”);
break;
}
if (i == 2 || i == 3)
{
flag = 1;
printf(“Lucky You!\n”);
break;
}
if (i > 3)
{
flag = 1;
printf(“Good Guess!\n”);
break;
}
}
}
if (flag == 0)
printf(“Game Over\n”);
return 0;
}

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

输入格式:

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

输出格式:

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

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

#include <stdio.h>

int main()

{

int n;

double dividend,divisor;

double sum=0;

int i;

double t;



scanf("%d",&n);

//n=20000;

dividend=2;

divisor=1;

for (i=1;i<=n; i++) {

    sum+=dividend/divisor;

    t=dividend;

    dividend=dividend+divisor;

    divisor=t;

}

printf("%.2f\n",sum);

return 0;

}

约分最简分式(15)
分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如:
12/34
表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:在scanf的格式字符串中加入“/”,让scanf来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如
5/6
表示6分之5。

输入样例:
60/120
输出样例:
1/2

#include<stdio.h>

int main(int argc, const char * argv[])
{
int a,b;
int t;
scanf("%d/%d",&a,&b);
int c=a,d=b;
while(d!=0){
t=c%d;
c=d;
d=t;
}
printf("%d/%d\n" ,a/c,b/c);

return 0;

}

念数字(15)
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:

输入在一行中给出一个整数,如:
1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:
-600
输出样例:
fu liu ling ling

#include<stdio.h>

int main(int argc, const char * argv[])
{
int x;
scanf("%d",&x);
if(x<0){
printf("fu ");
x=-x;
}
int mask=1;
int t=x;
while(t>9){
t/=10;
mask*=10;
}
do{
int d=x/mask;
switch(d){
case 0:printf(“ling”);break;
case 1:printf(“yi”);break;
case 2:printf(“er”);break;
case 3:printf(“san”);break;
case 4:printf(“si”);break;
case 5:printf(“wu”);break;
case 6:printf(“liu”);break;
case 7:printf(“qi”);break;
case 8:printf(“ba”);break;
case 9:printf(“jiu”);break;

   }
   
   if(mask>9) printf(" ");
   x%=mask;
   mask/=10;

}while(mask>0);
printf("\n");
return 0;

}
求a的连续和(15)
输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S = a+aa+aaa+…+aaa…a(n个a)。 如a为2、n为8时输出的是2+22+222+…+22222222的和。

输入格式:

输入在一行中给出两个整数,先后表示a和n。

输出格式:

在一行中输出要求的数列之和。

输入样例:
2 4
输出样例:
2468

#include<stdio.h>

int main(int argc, const char * argv[])
{
int a,n;
int i,t=0,sum=0;
scanf("%d %d",&a,&n);
for(i=0;i<n;i++){
t = t*10+a;
sum+=t;
}

printf("%d",sum);
return 0;

}

混合类型数据格式化输入(5)
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70

#include<stdio.h>

int main(int argc, const char * argv[])
{
double a;
int b;
char c;
double d;
scanf("%lf %d %c %lf",&a,&b,&c,&d);
printf("%c %d %.2lf %.2lf",c,b,a,d);
return 0;

}

简单计算器(20)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:
1+2*10-10/2=
输出样例:
10

#include<stdio.h>

int main(int argc, const char * argv[])
{
char ch=‘0’;
int result,i,flag = 0;
scanf("%d",&result);
while(ch!=’=’){
scanf("%c",&ch);
if(ch==’=’)
break;
scanf("%d",&i);
if(ch == ‘+’)
result +=i;
else if(ch == ‘-’)
result-=i;
else if(ch==’’)
result
=i;
else if(ch==’/’)
{
if(i!=0)
result/=i;
else
flag =1;
}
else
flag=1;
}
if(flag)
printf(“error\n”);
else
printf("%d",result);

	return 0;

}

#include <stdio.h>

int main(int argc, const char * argv[])

{
int a,b;
char c;
scanf("%d",&a);

while(scanf("%c",&c)){
	switch(c){
		case '+':{scanf("%d",&b);a+=b;break;}
		case '-':{scanf("%d",&b);a-=b;break;}
		case '*':{scanf("%d",&b);a*=b;break;}
		case '/':{scanf("%d",&b);
		
		if(b==0){
			printf("ERROR\n");
			return 0;
		} else{
			a/=b;break;
		}
	}
	case '=':{printf("%d\n",a);return 0;}
	default:{
			printf("ERROR\n");return 0;
	} 
		
	}
}
return 0;

}

字符串字母大小写转换(10)

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。

输入格式:

输入在一行中给出一个长度不超过40的、以#结束的非空字符串。

输出格式:

在一行中按照要求输出转换后的字符串。

输入样例:
Hello World! 123#
输出样例:
hELLO wORLD! 123
#include<stdio.h>

int main(int argc, const char * argv[])
{
char c;
c = getchar();
while(c!=’#’)
{
if(c>=‘a’&& c<=‘z’)
{
c-=32;}
else if(c>=‘A’&&c<=‘Z’)
{
c+=32;
}
printf("%c",c);
c = getchar();
}
return 0;

}

单词长度(15)

你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it’s”算一个单词,长度为4。注意,行中可能出现连续的空格;最后的‘.’不计算在内。

输入格式:

输入在一行中给出一行文本,以‘.’结束。

提示:用scanf("%c",…);来读入一个字符,直到读到‘.’为止。

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It’s great to see you here.
输出样例:

4 5 2 3 3 4

#include<stdio.h>

int main(int argc, const char * argv[])
{
char s[100];
int i = 0;
do {
scanf("%c",&s[i]);
i++;
}while(s[i-1]!=’.’);
int j;
int cnt=0;
int k=0;
for(j=0;j<i;j++)
{
if(s[j] !=’ ‘)
{
cnt++;
if(k!=0&&s[j]!=’.’)
{
printf(" “);
k = 0;
}
if(s[j]==’.’&&s[j-1]!=’ '&&cnt!=1)
{
printf(”%d",cnt-1);
}
}
else if(cnt !=0){
printf("%d",cnt);
cnt = 0;
k=1;
}
}
return 0;

}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值