mooc C语言 第七周2 答案.docx
《mooc C语言 第七周2 答案.docx》由会员分享,可在线阅读,更多相关《mooc C语言 第七周2 答案.docx(13页珍藏版)》请在冰豆网上搜索。
moocC语言第七周2答案
递归法计算游戏人员的年龄
题目内容:
有n个人围坐在一起,问第n个人多大年纪,他说比第n-1个人大2岁;问第n-1个人,他说比第n-2个人大2岁,…..,问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。
第1个人说自己10岁,问第n个人多大年纪。
递归函数原型:
unsignedintComputeAge(unsignedintn);
提示:
计算年龄的递归公式为:
输入格式:
“%u”
输出格式:
“Theperson’sageis%u\n”
输入样例1:
5↙
输出样例1:
The_person’s_age_is_18
输入样例2:
10↙
输出样例2:
The_person’s_age_is_28
#include
unsignedintComputeAge(unsignedintn);
intmain()
{
unsignedintage;
scanf("%u",&age);
printf("Theperson'sageis%u\n",ComputeAge(age));
return0;
}
unsignedintComputeAge(unsignedintn)
{
if(n==1)
return10;
else
{
returnComputeAge(n-1)+2;
}
}
∙1递归法计算两个数的最大公约数
题目内容:
利用最大公约数的性质计算。
对正整数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
程序运行结果示例1:
Inputa,b:
16,24↙
8
程序运行结果示例2:
Inputa,b:
-2,-8↙
Inputerror!
输入提示信息:
”Inputa,b:
”
输入格式:
”%d,%d”
输出格式:
输出最大公约数:
”%d\n”
输入错误提示信息:
”Inputerror!
\n”
#include
intGcd(inti,intj);
intmain()
{
inta,b;
intc;
printf("Inputa,b:
");
scanf("%d,%d",&a,&b);
c=Gcd(a,b);
if(c==-1)
{
printf("Inputerror!
\n");
}
else
{
printf("%d\n",c);
}
return0;
}
intGcd(inti,intj)
{
if(i<=0||j<=0)
{
return-1;
}
else
{
if(i==j)
{
returni;
}
elseif(i>j)
{
returnGcd(i-j,j);
}
else
{
returnGcd(i,j-i);
}
}
寻找中位数v1.0
题目内容:
编写一个函数返回三个整数中的中间数。
函数原型为:
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
#include
intmid(inta,intb,intc);
intmain()
{
inti,j,k;
scanf("%d%d%d",&i,&j,&k);
printf("Theresultis%d\n",mid(i,j,k));
return0;
}
intmid(inta,intb,intc)
{
if((ab&&b>c))
{
returnb;
}
else
{
returnmid(b,c,a);
}
}
∙1还原算术表达式
题目内容:
编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99
程序运行结果示例1:
Inputn(n<1000):
532↙
X=3,Y=2,Z=1
程序运行结果示例2:
Inputn(n<1000):
977↙
Invalid
输入提示:
”Inputn(n<1000):
\n”
输入格式:
“%d”
输出格式:
”X=%d,Y=%d,Z=%d\n”
计算不成功(无解)的输出提示:
”Invalid\n”
特别注意x>5ory>5orz>5;
#include
voidResolution(inti);
intmain()
{
intn;
printf("Inputn(n<1000):
\n");
scanf("%d",&n);
Resolution(n);
return0;
}
voidResolution(inti)
{
intfind=0;
intx,y,z;
for(x=1;x<=9;x++)
{
for(y=1;y<=9;y++)
{
for(z=1;z<=9;z++)
{
if(z*2+(y+z)*10+(x+y)*100==i)
{
printf("X=%d,Y=%d,Z=%d\n",x,y,z);
find=1;
break;
}
}
}
}
if(!
find)
{
printf("Invalid\n");
}
}
谐均值计算
题目内容:
两数值的谐均值可以这样计算:
首先对两数值的倒数取平均值,最后再取倒数。
编写一个带有两个double参数的函数,计算这两个参数的谐均值。
函数原型为:
doubleCalculate(doublex,doubley);
程序运行结果示例1:
Inputtwodoubles:
34↙
1/((1/x+1/y)/2)=3.429
程序运行结果示例2:
Inputtwodoubles:
6.53.8↙
1/((1/x+1/y)/2)=4.796
输入提示信息:
”Inputtwodoubles:
\n”
输入格式:
“%lf%lf”
输出格式:
”1/((1/x+1/y)/2)=%0.3f\n”(注意:
等号的两边各有一个空格)
#include
doubleCalculate(doublex,doubley);
intmain()
{
doublex,y;
printf("Inputtwodoubles:
\n");
scanf("%lf%lf",&x,&y);
printf("1/((1/x+1/y)/2)=%0.3f\n",Calculate(x,y));
return0;
}
doubleCalculate(doublex,doubley)
{
return1.0/((1.0/x+1.0/y)/2);
}
输出指定行列数的字符
题目内容:
编写一个函数,函数原型:
voidChline(charch,intcolumn,introw);
该函数的3个参数是一个字符和两个整数。
字符参数是需要输出的字符。
第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。
编写一个调用该函数的程序。
程序运行结果示例1:
inputachar:
k↙
inputcolumnandrow:
23↙
kk
kk
kk
程序运行结果示例2:
inputachar:
a↙
inputcolumnandrow:
32↙
aaa
aaa
字符输入提示信息:
”inputachar:
\n”
行列数输入提示信息:
”inputcolumnandrow:
\n”
输入格式:
“%c”
“%d%d”
输出格式:
”%c”
#include
voidChline(charch,intcolumn,introw);
intmain()
{
charc;
intcol,r;
printf("inputachar:
\n");
scanf("%c",&c);
printf("inputcolumnandrow:
\n");
scanf("%d%d",&col,&r);
Chline(c,col,r);
return0;
}
voidChline(charch,intcolumn,introw)
{
inti,j;
for(i=0;i{
for(j=0;j{
printf("%c",ch);
}
printf("\n");
}
}
题目内容:
在一种室内互动游戏中,魔术师要每位观众心里想一个三位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。
只要观众说出这个和是多少,则魔术师一定能猜出观众心里想的原数abc是多少。
例如,观众甲说他计算的和值是1999,则魔术师立即说出他想的数是443,而观众乙说他计算的和值是1998,则魔术师说:
“你算错了!
”。
请编程模拟这个数字魔术游戏。
要求用函数实现,函数原型为:
intMagic(intm);
其中形参m代表观众计算的和值。
输入格式:
”%d”
输出格式:
观众计算错误,魔术师给出的结论:
”Thesumyoucalculatediswrong!
\n”
观众计算正确,魔术师给出的结论:
”Thenumberis%d\n”
输入样例1:
1998↙
输出样例1:
The_sum_you_calculated_is_wrong!
输入样例2:
1999↙
输出样例2:
The_number_is_443
计算礼炮声响次数
题目内容:
在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。
已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。
假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。
输入格式:
无
输出格式:
”n=%d”
#include
intmain()
{
inta,b,count=21*3;
for(a=5;a<=21*5;a=a+5)
{
if(a%30==0)
{
count--;
}
if(a%35==0)
{
count--;
}
}
for(b=7;b<=21*7;b=b+7)
{
if(b%42==0)
{
count--;
}
}
printf("n=%d",count);
return0;
}
迭代法
#include
intMaxCommonFactor(inta,intb);
intmain()
{
inta,b,x;
printf("Inputa,b:
");
scanf("%d,%d",&a,&b);
x=MaxCommonFactor(a,b);
if(x!
=-1)
{
printf("MaxCommonFactor=%d\n",x);
}
else
{
printf("Inputerror!
\n");
}
return0;
}
//函数功能:
计算两个正整数的最大公约数,-1表示没有最大公约数
intMaxCommonFactor(inta,intb)
{
intr;
if(a<=0||b<=0)return-1;//保证输入的参数为正整数
do{
r=a%b;
a=b;
b=r;
}while(r!
=0);
returna;
}
水手分椰子
题目内容:
n(1然后,第2个水手把剩下的n-1堆混合后重新分为等量的n堆,还剩下1个给了猴子,自己藏起1堆。
以后第3、4个水手依次按此方法处理。
最后,第n个水手把剩下的椰子分为等量的n堆后,同样剩下1个给了猴子。
请用迭代法编程计算并输出原来这堆椰子至少有多少个,n的值要求从键盘输入。
若输入的n值超出要求的范围,程序输出”Error!
”。
提示:
分成的等量的堆数应该与水手的数量一致.
程序运行结果示例1:
Inputn(1
5↙
y=3121
程序运行结果示例2:
Inputn(1
7↙
Error!
输入提示信息:
“Inputn(1\n”
输入格式:
“%d”
输出格式:
”y=%d\n”
输入错误提示信息:
”Error!
\n”
这是一道著名的数学问题,解题通式为
y=a(a/m)n-1-db/c
y──被分的椰子的总个数
a──每次分的份数,
n──总共分的次数
b──每次分a份后的余数.
c──每次分a份后拿走的份数
d──每次分a份后拿走c份后,剩下再分的份数.
m——(a/d)的最大公约数
#include
intdivide(intn,intm);
staticintpeople;
intmain()
{
inti;
intn;
printf("Inputn(1\n");
scanf("%d",&n);
people=n;
if(n<=1||n>5)
{
printf("Error!
\n");
}
else
{
for(i=1;;i++)
{
if(divide(i,n))
{
printf("y=%d\n",i);
break;
}
}
}
return0;
}
intdivide(intn,intm)
{
if(n/people==0||n%people!
=1)
return0;
if(m==1)
return1;
returndivide(n-n/people-1,m-1);
}
|