哈工大C语言程序设计精髓第五周
程序员文章站
2022-07-15 11:01:05
...
由于这些代码也是我初学时写的代码,故其中的规范程度及简洁程度并不很好(此处我后来写的有可以参考一下->C语言代码规范),但是能很好的接近出初学者的水平,也更有参考价值!排版不易,喜欢就点个赞吧!如有问题,请勿吐槽,欢迎留言互相学习。
第5周编程题在线测试
-
马克思手稿中的趣味数学题
题目内容:
编程求解马克思手稿中的趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请编程计算男人、女人和小孩各有几人?
输出提示信息: “Man Women Children\n” (注意:每个单词之间有3个空格)
输出格式:"%3d%8d%8d\n" (注意:输出数据按照男人的数量递增的顺序给出)
代码实现:
#include <stdio.h>
int main()
{
int a,b,c;
printf("Man Women Children\n");
for (a=0;a<=28;a++)
for (b=0;b<=28;b++)
for (c=0;c<=28;c++)
if(a+b+c==30&&a*3+b*2+c==50)
printf("%3d%8d%8d\n",a,b,c);
return 0;
}
-
猜神童年龄
题目内容:
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这
10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。
【解题思路】:因为已知年龄的立方是一个4位数字,所以可以推断年龄的范围在10到22之间,因此确定穷举范围为10到22。如果年龄还满足“年龄的4次方是一个6位数”这个条件,则先计算年龄的立方值的每一位数字,从低位到高位分别保存到变量b1,b2,b3,b4
中,再计算年龄的4次方值的每一位数字,从低位到高位分别保存到变量a1,a2,a3,a4,a5,a6中。如果上述10个数字互不相同,则必定是包含了从0到9这10个数字并且每个都恰好出现1次,因此只要判断上述10个数字互不相同,即可确定这个年龄值为所求。
输出格式:“age=%d\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c,d,x1,x2,x3,x4,x5,x6,x7,x8,x9,x0;
for(a=22;a>=10;a--)
{
b=a*a*a;
x1=b/1000,x2=(b%1000)/100,x3=(b%100)/10,x4=b%10;
c=a*a*a*a;
if(c>=100000 && c<=999999)
{x5=c/100000,x6=(c%100000)/10000,x7=(c%10000)/1000,x8=(c%1000)/100,x9=(c%100)/10,x0=c%10;}
if(x1!=x2&&x1!=x3&&x1!=x4&&x1!=x5&&x1!=x6&&x1!=x7&&x1!=x8&&x1!=x9&&x1!=x0&&x2!=x3&&x2!=x4&&x2!=x5&&x2!=x6&&x2!=x7&&x2!=x8&&x2!=x9&&x2!=x0&&x3!=x4)
{
printf("age=%d\n",a-1);
goto END;
}
}
END: ;
return 0;
}
-
闰年相关的问题v3.0——计算有多少闰年
题目内容:
从键盘输入你的出生年和今年的年份,编程判断并输出从你的出生年到今年之间中有多少个闰年。
程序的运行结果示例1:
Input your birth year:2000↙
Input this year:2020↙
2000
2004
2008
2012
2016
2020
count=6
输入提示信息:“Input your birth year:”
输入提示信息:“Input this year:”
输入格式:"%d"
输出格式:
闰年年份: “%d\n”
闰年总数:“count=%d\n”
代码实现:
#include <stdlib.h>
int main()
{
int a,b,c,d,e,f;
printf("Input your birth year:");
scanf("%d",&a);
printf("Input this year:");
scanf("%d",&b);
c=a/4,d=b/4,e=0;
if(c*4==a)
{
e=c*4,f=0;
while(e<=b)
{printf("%d\n",e);
e=e+4;
f++;
}}
else
{
e=c*4+4,f=0;
while(e<=b)
{printf("%d\n",e);
e=e+4;
f++;
}}
printf("count=%d\n",f);
return 0;
}
-
闰年相关的问题v4.0——计算心跳数
题目内容:
假设人的心率为每分钟跳75下,编程从键盘输入你的出生年和今年的年份,然后以年为单位计算并输出从你出生开始到目前为止的生命中已有的心跳总数(要求考虑闰年)。
程序运行结果示例1:
Input your birth year:1986↙
Input this year:2016↙
The heart beats in your life: 1183356000
输入提示信息:“Input your birth year:”
输入提示信息:“Input this year:”
输入格式:"%d"
输出格式:“The heart beats in your life: %lu”
代码实现:
#include<stdio.h>
int isleap(int n)//判断闰年
{
if((n%4 == 0 && n%100 != 0)||(n%400 == 0)) return 1;
else return 0;
}
int main()
{
int day1 = 365,day2 = 366;
int begin,end,number;
long unsigned int count = 0;
printf("Input your birth year:");
scanf("%d",&begin);
printf("Input this year:");
scanf("%d",&end);
for(;begin < end;begin++){
number = isleap(begin)?day2:day1;
count += number*24*60*75;
}
printf("The heart beats in your life: %lu",count);
return 0;
}
第五周练兵区——编程题
-
判断一个整型数据有几位v2.0
题目内容:
从键盘输入一个整型数据(int型),编写程序判断该整数共有几位,并输出包含各个数字的个数。例如,从键盘输入整数16644,该整数共有5位,其中有1个1,2个6,2个4。
程序运行结果示例1:
Please enter the number:
12226↙
12226: 5 bits
1: 1
2: 3
6: 1
程序运行结果示例2:
Please enter the number:
-12243↙
-12243: 5 bits
1: 1
2: 2
3: 1
4: 1
输入格式: “%d”
输出格式:
输入提示信息:“Please enter the number:\n”
判断该整数共有几位:"%d: %d bits\n"
包含数字0的个数:“0: %d\n”
包含数字1的个数:“1: %d\n”
包含数字2的个数:“2: %d\n”
包含数字3的个数:“3: %d\n”
包含数字4的个数:“4: %d\n”
包含数字5的个数:“5: %d\n”
包含数字6的个数:“6: %d\n”
包含数字7的个数:“7: %d\n”
包含数字8的个数:“8: %d\n”
包含数字9的个数:“9: %d\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,d,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9;
x0=x1=x2=x3=x4=x5=x6=x7=x8=x9=0;
printf("Please enter the number:\n");
scanf("%d",&a);
b = fabs(a);
c=1;
do
{
c++;
d = b%10;
b = b/10;
switch(d)
{
case 0 :
x0++;
break;
case 1 :
x1++;
break;
case 2 :
x2++;
break;
case 3 :
x3++;
break;
case 4 :
x4++;
break;
case 5 :
x5++;
break;
case 6 :
x6++;
break;
case 7 :
x7++;
break;
case 8 :
x8++;
break;
case 9 :
x9++;
break;
}
}while(b/10!=0&&b>=10);
switch(b)
{case 0 :
x0++;
break;
case 1 :
x1++;
break;
case 2 :
x2++;
break;
case 3 :
x3++;
break;
case 4 :
x4++;
break;
case 5 :
x5++;
break;
case 6 :
x6++;
break;
case 7 :
x7++;
break;
case 8 :
x8++;
break;
case 9 :
x9++;
break;
}
printf("%d: %d bits\n",a,c);
if (x0>0)
printf("0: %d\n",x0);
if (x1>0)
printf("1: %d\n",x1);
if (x2>0)
printf("2: %d\n",x2);
if (x3>0)
printf("3: %d\n",x3);
if (x4>0)
printf("4: %d\n",x4);
if (x5>0)
printf("5: %d\n",x5);
if (x6>0)
printf("6: %d\n",x6);
if (x7>0)
printf("7: %d\n",x7);
if (x8>0)
printf("8: %d\n",x8);
if (x9>0)
printf("9: %d\n",x9);
return 0;
}
-
奖金计算
题目内容:
企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时,高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数?
程序运行结果示例1:
789↙
bonus=78
程序运行结果示例2:
789516↙
bonus=36342
输入格式: “%ld”
输出格式:“bonus=%ld\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
long int a,b;
scanf("%ld",&a);
if (a<=100000)
b=a*0.1;
else if(a<=200000)
b=10000+(a-100000)*0.075;
else if(a<=400000)
b=17500+(a-200000)*0.05;
else if(a<=600000)
b=27500+(a-400000)*0.03;
else if(a<=1000000)
b=33500+(a-600000)*0.015;
else
b=39500+(a-1000000)*0.01;
printf("bonus=%ld\n",b);
return 0;
}
-
程序修改—1
题目内容:
修改下面这个程序使其快速计算1+2+3……+n的值,n从键盘输入。并按照下面给出的运行示例检查程序。
#include <stdio.h>
int main()
{
int i, j, sum = 0, n=100;
for (i=1,j=n; i<=j; i++,j--)
{
sum = sum + i + j;
}
printf("sum = %d", sum);
return 0;
}
- 程序运行结果示例1:
5↙
sum = 15
程序运行结果示例2:
6↙
sum = 21
输入格式: “%d”
输出格式: “sum = %d” (注意:等号两侧各有一个空格)
代码实现:
#include <stdio.h>
int main()
{
int i, j, sum = 0, n;
scanf("%d",&n);
for (i=1; i<=n; i++)
{
sum = sum + i;
}
printf("sum = %d", sum);
return 0;
}
-
程序修改—2
题目内容:
修改下面这个用do-while语句实现的程序,改用while语句实现,并对比其优缺点。
#include <stdio.h>
int main()
{
int sum = 0, m;
do{
printf("Input m:\n");
scanf("%d", &m);
sum = sum + m;
printf("sum = %d\n", sum);
}while (m != 0);
return 0;
}
- 程序运行结果示例:
Input m:
1↙
sum = 1
Input m:
2↙
sum = 3
Input m:
3↙
sum = 6
Input m:
4↙
sum = 10
Input m:
0↙
输入格式:"%d"
输出格式:
输入提示: “Input m:\n”
输出累加和: “sum = %d\n”(注意:等号两侧各有一个空格)
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m=1,sum=0;
while(m!=0)
{
printf("Input m:\n");
scanf("%d",&m);
sum+=m;
if(m==0) break;
printf( "sum = %d\n",sum);
}
return 0;
}
-
程序改错-1
题目内容:
我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?目前程序运行结果有误,请问为什么会比正确答案多出三个解?不仅要找出错误和修正错误,还要求利用以前学过的知识分析错误的原因。
#include <stdio.h>
int main()
{
int x, y, z;
for (x=0; x<=20; x++)
{
for (y=0; y<=33; y++)
{
z = 100 - x - y;
if (5*x + 3*y + z/3 == 100)
{
printf("x=%d, y=%d, z=%d\n", x, y, z);
}
}
}
return 0;
}
- 程序目前的运行结果:
x=0, y=25, z=75
x=3, y=20, z=77
x=4, y=18, z=78
x=7, y=13, z=80
x=8, y=11, z=81
x=11, y=6, z=83
=12, y=4, z=84
程序正确的运行结果:
x=0, y=25, z=75
x=4, y=18, z=78
x=8, y=11, z=81
x=12, y=4, z=84
输入格式: 无
输出格式:
"x=%d, y=%d, z=%d\n
代码实现:
#include <stdio.h>
int main()
{
int x, y, z;
for (x=0; x<=20; x++)
{
for (y=0; y<=33; y++)
{
z = 100 - x - y;
if (5*x + 3*y + z/3 == 100 && z%3==0)
{
printf("x=%d, y=%d, z=%d\n", x, y, z);
}
}
}
return 0;
}
-
程序改错-2
题目内容:
从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。已知负数、0和1都不是素数。请找出下面程序的错误并改正之,同时按照给出的运行示例检查修改后的程序。
#include <stdio.h>
#include <math.h>
int main()
{
int n, i;
printf("Input n:\n");
scanf("%d", &n);
for (i=2; i<=sqrt(n); i++)
{
if (n % i = 0)
{
printf("No!\n");
}
}
printf("Yes!\n");
return 0;
}
- 程序的运行结果示例1:
Input n:
-3↙
No!
程序的运行结果示例2:
Input n:
0↙
No!
程序的运行结果示例3:
Input n:
1↙
No!
程序的运行结果示例4:
Input n:
6↙
No!
程序的运行结果示例5:
Input n:
7↙
Yes!
输入格式: “%d”
输出格式:
输入提示信息: “Input n:\n”
是素数: “Yes!\n”
不是素数: “No!\n”
代码实现:
#include <stdio.h>
#include <math.h>
int main()
{
int n, i;
printf("Input n:\n");
scanf("%d", &n);
if (n==0 || n==1 || n<0)
printf("No!\n");
else
{
for (i=2; i<n; i++)
{
if (n % i == 0)
{
printf("No!\n");
exit(0);
}
}
printf("Yes!\n");
}
return 0;
}
-
程序改错-3
题目内容:
从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。
#include <stdio.h>
int main()
{
int x1, x2;
do{
printf("Input x1, x2:");
scanf("%d,%d", &x1, &x2);
}while (x1 * x2 > 0);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
- 程序正确的运行结果示例:
Input x1, x2:
a,s↙
Input x1, x2:
a,1↙
Input x1, x2:
2,s↙
Input x1, x2:
1,2↙
Input x1, x2:
-1,-2↙
Input x1, x2:
0,3↙
Input x1, x2:
1.2,3.4↙
Input x1, x2:
1.2,5↙
Input x1, x2:
-1,3↙
x1=-1,x2=3
输入格式: “%d,%d”
输出格式:
输入提示信息:“Input x1, x2:\n”
输出: “x1=%d,x2=%d\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int x1, x2, n, flag;
do
{
flag = 0;
printf("Input x1, x2:\n");
n = scanf("%d,%d", &x1, &x2);
switch (n)
{
case 0:
while (getchar() != '\n');
flag = 1;
break;
case 1:
while (getchar() != '\n');
flag = 1;
break;
default:
if (x1 * x2 >= 0)
flag = 1;
else
flag = 0;
break;
}
}
while (flag == 1);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
-
猴子吃桃程序_扩展1
题目内容:
猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。
程序的运行结果示例1:
Input days:
5↙
x=46
程序的运行结果示例2:
Input days:
10↙
x=1534
输入格式: “%d”
输出格式:
输入提示信息:“Input days:\n”
输出:“x=%d\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c=1;
printf("Input days:\n");
scanf("%d",&a);
for(b=2;b<=a;a--)
c=(c+1)*2;
printf("x=%d\n",c);
return 0;
}
-
猴子吃桃程序_扩展2
题目内容:
猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。同时还要增加对用户输入数据的合法性验证(如:不允许输入的天数是0和负数)
程序运行结果示例:
Input days:
0↙
Input days:
-5↙
Input days:
a↙
Input days:
3↙
x=10
输入格式: “%d”
输出格式:
输入提示信息:“Input days:\n”
输出:“x=%d\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c=1,d,e;
printf("Input days:\n");
scanf("%d",&a);
do
{
d=1;
printf("Input days:\n");
e = scanf("%d",&a);
switch(e)
{
case 0:
while(getchar()!='\n')
d=1;
break;
case 1:
for(b=2;b<=a;a--)
c=(c+1)*2;
break;
}
} while(a<=0);
printf("x=%d\n",c);
return 0;
}
-
6位密码输入检测
题目内容:
从键盘输入6位仅由数字0~9组成的密码。用户每输入一个密码并按回车键后,程序给出判断:如果是数字,则原样输出该数字,并提示用户目前已经输入了几位密码,同时继续输入下一位密码;否则,程序提示"error",并让用户继续输入下一位密码。直到用户输入的密码全部是数字为止。
程序的运行结果示例:
Input your password:
1↙
1, you have enter 1-bits number
6↙
6, you have enter 2-bits number
a↙
error
d↙
error
4↙
4, you have enter 3-bits number
6↙
6, you have enter 4-bits number
8↙
8, you have enter 5-bits number
2↙
2, you have enter 6-bits number
输入提示信息:“Input your password:\n”
输入格式: “%c”
输出格式:
如果输入的是数字,输出格式为:"%c, you have enter %d-bits number\n"
如果输入的不是数字,输出提示信息:“error\n”
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,d,b,c,e;
d=0,a=c=1,e=0;
printf("Input your password:\n");
do
{
b=scanf("%d",&a);
switch (b)
{case 0:
printf("error\n");
getchar();
c=1;
break;
case 1:
d++;
printf("%d, you have enter %d-bits number\n",a,d);
c=0;
break;
}
e++;
}while(c==1||e<=7);
return 0;
}
-
判断一个整型数据有几位v1.0
题目内容:
从键盘输入一个整型数据(int型),编写程序判断该整数共有几位。例如,从键盘输入整数16644,该整数共有5位。
程序运行结果示例1:
Please enter the number:
21125↙
21125: 5 bits
程序运行结果示例2:
Please enter the number:
-12234↙
-12234: 5 bits
输入提示信息:“Please enter the number:\n”
输入格式: “%d”
输出格式:"%d: %d bits\n"
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,d,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9;
x0=x1=x2=x3=x4=x5=x6=x7=x8=x9=0;
printf("Please enter the number:\n");
scanf("%d",&a);
b = fabs(a);
c=1;
do
{
c++;
d = b%10;
b = b/10;
}while(b/10!=0&&b>=10);
printf("%d: %d bits\n",a,c);
}
-
检测输入数据中奇数和偶数的个数
题目内容:
从键盘输入一系列正整数,输入-1表示输入结束(-1本身不是输入的数据)。编写程序判断输入数据中奇数和偶数的个数。如果用户输入的第一个数据就是-1,则程序输出"over!"。否则。用户每输入一个数据,输出该数据是奇数还是偶数,直到用户输入-1为止,分别统计用户输入数据中奇数和偶数的个数。
程序运行结果示例1:
Please enter the number:
1↙
1:odd
5↙
5:odd
8↙
8:even
9↙
9:odd
12↙
12:even
17↙
17:odd
-1↙
The total number of odd is 4
The total number of even is 2
程序运行结果示例2:
Please enter the number:
-1↙
over!
The total number of odd is 0
The total number of even is 0
输入提示信息:“Please enter the number:\n”
输入格式: “%d”
输出格式:
用户输入的第一个数据就是-1,输出格式:“over!\n”
奇数的输出格式:"%d:odd\n"
偶数的输出格式:"%d:even\n"
输入数据中奇数的个数统计:“The total number of odd is %d\n”
输入数据中偶数的个数统计:“The total number of even is %d\n”
代码实现:
#include <stdio.h>
int main()
{
int a,b,c;
printf("Please enter the number:\n");
b=c=0;
scanf("%d",&a);
if(a!=-1)
{
while(a!=-1)
{
if(a!=-1)
{if(a%2==0)
{printf("%d:even\n",a);
b++;
}
else
{printf("%d:odd\n",a);
c++;
}
}
else
break;
scanf("%d",&a);
}}
else
{
printf("over!\n");
}
printf("The total number of odd is %d\n",c);
printf("The total number of even is %d\n",b);
return 0;
}
-
计算球的反弹高度
题目内容:
一个球从100米高度*落下,每次落地后反跳回原高度的一半,再落下并反弹…,求它在第5次和第10次落地时,分别共经过了多少米?第5次和第10次反弹分别是多高?要求计算结果保留到小数点后3位。用户从键盘输入想要计算的第n次(n<=15)。程序中所有浮点数的数据类型均为float。
程序运行结果示例1:
Input:
5↙
5 times:
287.500
3.125
程序运行结果示例2:
Input:
10↙
10 times:
299.609
0.098
输入提示信息:“Input:\n”
输入格式: “%d”
输出格式:
反弹次数:"%d times:\n"
第n次反弹共经过多少米:"%.3f\n"
第n次的反弹高度:"%.3f\n"
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b;
float c=100,d=100,e=100;
printf("Input:\n");
scanf("%d",&a);
for(b=1;b<a;b++)
{
e=e/2;
c=c+e;}
printf("%d times:\n",a);
printf("%.3f\n",c*2-100);
d=pow(0.5,a)*d;
printf("%.3f\n",d);
return 0;
}