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