哈工大C语言程序设计精髓第六十二周编程题答案文档格式.docx
- 文档编号:18212095
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:55
- 大小:57.75KB
哈工大C语言程序设计精髓第六十二周编程题答案文档格式.docx
《哈工大C语言程序设计精髓第六十二周编程题答案文档格式.docx》由会员分享,可在线阅读,更多相关《哈工大C语言程序设计精髓第六十二周编程题答案文档格式.docx(55页珍藏版)》请在冰豆网上搜索。
else{
break;
}
s=atoi(score);
if(s>
=90)
grade='
A'
;
elseif(s>
=80)
B'
=70)
C'
=60)
D'
else
E'
grade:
%c\n"
grade);
return0;
}
6.2编程计算a+aa+aaa+…+aa…a(n个a)的值(4分)
题目内容:
编程计算a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。
例如,当n=4,a=2,表示计算2+22+222+2222的值。
math.h>
intn,a,i,j;
doublep=0,q=0;
Inputa,n:
scanf("
%d,%d"
&
a,&
n);
for(i=1;
i<
=n;
i++)
for(j=0,p=0;
j<
i;
j++)
p=p+a*pow(10,j);
q=p+q;
sum=%.0f\n"
q);
6.3
搬砖问题(4分)
n块砖(
27<
n<
=77
),36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?
请用穷举法编程求解,n的值要求从键盘输入。
输出结果按照男人数量升序给出(见下面示例3)。
#include"
stdio.h"
main()
inta,b,c;
longn,i,t,s=0;
Inputn(27<
=77):
scanf("
%d"
&
for(a=0;
4*a<
=n;
a++)
for(b=0;
4*a+3*b<
b++)
for(c=0;
4*a+3*b+c/2<
c+=2)
if(4*a+3*b+c/2==n&
c%2==0&
a+b+c==36)
{
printf("
men=%d,women=%d,children=%d\n"
a,b,c);
}
6.4
编程输出某年某月有多少天(考虑到闰年)。
(5分)
从键盘输入一个年份和月份,输出该月有多少天(考虑闰年),用switch语句编程。
{intyear,month,day;
printf("
Inputyear,month:
scanf("
year,&
month);
switch(month)
case1:
day=31;
break;
case2:
day=28;
case3:
case4:
day=30;
case5:
case6:
case7:
case8:
case9:
case10:
case11:
case12:
default:
day=-1;
if((year%4==0&
year%100!
=0||year%400==0)&
month==2)day=29;
if(day!
=-1)
%ddays\n"
day);
return0;
7.1递归法计算游戏人员的年龄(4分)
有n个人围坐在一起,问第n个人多大年纪,他说比第n-1个人大2岁;
问第n-1个人,他说比第n-2个人大2岁,.....,问第3个人,他说比第2个人大2岁;
问第2个人,他说比第1个人大2岁。
第1个人说自己10岁,问第n个人多大年纪。
递归函数原型:
unsignedintComputeAge(unsignedintn);
提示:
计算年龄的递归公式为:
unsignedintComputeAge(unsignedintn){
inti,j,k,s=23,n,c,age;
Theperson'
sageis%u\n"
8+2*n);
7.2递归法计算两个数的最大公约数(4分)
利用最大公约数的性质计算。
对正整数a和b,当a>
b时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。
反复使用最大公约数的上述性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。
这三条性质,也可以表示为:
性质1
如果a>
b,则a和b与a-b和b的最大公约数相同,即Gcd(a,b)=Gcd(a-b,b)
性质2
如果b>
a,则a和b与a和b-a的最大公约数相同,即Gcd(a,b)=Gcd(a,b-a)
性质3
如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a,b)=a=b
#include<
intgys(inta,intb)
intr;
r=a%b;
if(r==0)returnb;
elsereturngys(b,r);
Inputa,b:
"
inta,b;
b);
if(a<
=0||b<
=0){
printf("
%d\n"
gys(a,b));
7.3寻找中位数v1.0(4分)
编写一个函数返回三个整数中的中间数。
函数原型为:
intmid(inta,intb,intc);
函数功能是返回a,b,c三数中大小位于中间的那个数。
输入格式:
%d%d%d"
输出格式:
Theresultis%d\n"
输入样例1:
12618↙
输出样例1:
The_result_is_12
输入样例2:
-97-2↙
输出样例2:
The_result_is_-2
注意:
为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(注意:
在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。
intmedian(inta,intb,intc)
if(a<
b)
if(b<
c){returnb;
else{returna<
c?
c:
a;
}//a<
c<
b:
c<
a<
b
if(c>
a){returna;
}//c>
a>
else{returnc>
b?
b;
}//a>
c>
a>
b>
c
inta,b,c;
b,&
c);
median(a,b,c));
7.4
还原算术表达式(4分)
编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99<
1000)的值要求从键盘输入。
程序运行结果示例1:
Inputn(n<
1000):
532↙
X=3,Y=2,Z=1
程序运行结果示例2:
977↙
Invalid
输入提示:
"
X=%d,Y=%d,Z=%d\n"
计算不成功(无解)的输出提示:
Invalid\n"
inta,b,c,n,s,x,y,z,flag=0;
for(x=1;
x<
=9;
x++){
for(y=1;
y<
y++){
for(z=0;
z<
z++){
if(x*100+y*10+z+y*100+z*11==n){
flag=1;
a=x,b=y,c=z;
break;
if(flag)
a,b,c);
elseprintf("
8.1矩阵转置v1.0(4分)
用二维数组作为函数参数,编程计算并输出n×
n阶矩阵的转置矩阵。
其中,n的值不超过10,n的值由用户从键盘输入。
Inputn:
3↙
Input3*3matrix:
123↙
456↙
789↙
Thetransposedmatrixis:
1
4
7
2
5
8
3
6
9
2↙
Input2*2matrix:
12↙
45↙
4
5
intmain(){
intn;
Input%d*%dmatrix:
n,n);
intm[n][n],i,j;
for(i=0;
n;
i++){
for(j=0;
j++){
scanf("
m[i][j]);
%4d"
m[j][i]);
8.2兔子生崽问题(4分)
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<
=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?
请编程求解该问题,n的值要求从键盘输入。
参考答案:
依题意,兔子的繁殖情况如图所示。
图中实线表示成兔仍是成兔或者小兔长成成兔;
虚线表示成兔生小兔。
观察分析此图可发现如下规律:
(1)每月小兔对数=上个月成兔对数。
(2)每月成兔对数=上个月成兔对数+上个月小兔对数。
综合
(1)和
(2)有:
每月成兔对数=前两个月成兔对数之和。
用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:
=12):
intn,total=0,i,s=0,b=1,t;
1);
for(i=2;
t=s;
s=b;
b=b+t;
s+b);
\nTotal=%d\n"
8.3
抓交通肇事犯(4分)
一辆卡车违犯交通规则,撞人后逃跑。
现场有三人目击事件,但都没记住车号,只记下车号的一些特征。
甲说:
牌照的前两位数字是相同的;
乙说:
牌照的后两位数字是相同的,但与前两位不同;
丙是位数学家,他说:
四位的车号刚好是一个整数的平方。
现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:
假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数
k=1000*i+100*i+10*j+j
式中,i和j都在0~9变化。
此外,还应使k=m*m,m是整数。
由于k是一个4位数,所以m值不可能小于31。
无
k=%d,m=%d\n"
inti,j,k,m,tk,tm;
for(m=31;
m<
100;
m++){
k=1000*i+100*i+10*j+j;
if(i!
=j&
m*m==k){
tm=m;
tk=k;
tk,tm);
8.4
检验并打印幻方矩阵。
(4分)
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。
从键盘输入一个5×
5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。
如果是幻方矩阵,输出提示信息:
Itisamagicsquare!
矩阵元素的输出:
(换行使用"
如果不是幻方矩阵,输出提示信息:
Itisnotamagicsquare!
17_24_1_8_15
23_5_7_14_16
4_6_13_20_22
10_12_19_21_3
11_18_25_2_9
(输人样例中“_”代表空格)
**17**24***1**8**15
**23***5***7**14**16
***4***6**13**20**22
**10**12**19**21***3
**11**18**25***2***9
(输出样例中“*”代表空格)
1_0_1_6_1
3_1_1_1_1
1_1_1_1_2
1_1_1_1_1
9_1_7_1_1
(输人样例中“_”代表空格,输出样例中“*”代表空格)
inta[5][5],i,j,t,row[5]={0},col[5]={0},dl1=0,dl2=0,flag=1;
5;
a[i][j]);
row[i]+=a[i][j];
col[i]+=a[j][i];
dl1+=a[i][i];
dl2+=a[4-i][4-i];
4;
if(col[i]!
=col[i+1]){
flag=0;
if(row[i]!
=row[i+1]){
if(col[1]!
=row[1]){
if(dl1!
=dl2){
=col[1]){
if(flag){
for(i=0;
for(j=0;
printf("
a[i][j]);
else{
9.1
重复数字检查(4分)
从键盘输入一个数,检查这个数中是否有重复出现的数字。
如果这个数中有重复出现的数字,则显示“Repeateddigit!
”;
否则显示“Norepeateddigit!
”。
已知函数原型:
intCountRepeatNum(intcount[],intn);
若有重复数字,则该函数返回重复出现的数字;
否则返回-1.
28212↙
Repeateddigit!
12345↙
Norepeateddigit!
%ld"
有重复数字,输出信息:
没有重复数字,输出信息:
intlog[10]={0},a[100];
intb,i=0,n,c,d;
while(n!
=0)
b=n%10;
n/=10;
a[i]=b;
i++;
a[i]=n;
intflag=0;
for(c=0;
c++)
for(d=c+1;
d<
d++)
if(a[c]==a[d])
flag=1;
//if(a[0]==a[i-1]||a[0]==a[1])flag=1;
if(flag)printf("
elseprintf("
9.2
教授的课(4分)
教授正在为一个有N个学生的班级讲授离散数学课。
他对某些学生缺乏纪律性很不满意,于是决定:
如果课程开始后上课的人数小于K,就取消这门课程。
从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。
如果该门课程被取消,则输出“Yes”,否则输出“No”。
假设教授在时刻0开始上课。
如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。
如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。
如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。
假设到达时间的绝对值不超过100,学生数N不超过1000。
要求在输入学生的到达时间之前,先输入N和K。
//函数功能:
根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0
intIsCancel(inta[],intn,intk);
Inputn,k:
4,3↙
-1-342↙
YES
5,3↙
-1-2-304↙
NO
输入包括两行数据:
第1行是n,k的值。
第2行是学生的到达时间。
课程被取消,输出"
YES"
课程不取消,输出"
NO"
stdio.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 语言程序设计 精髓 第六 十二 编程 答案