《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx
《《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx(20页珍藏版)》请在冰豆网上搜索。
《C语言程序设计》浙江科学技术版习题参考答案习题4
习题参考答案习题四
1./*输入一个正实数eps,计算下式的值。
要求最后一项的绝对值小于eps(保留6位小数)*/
#include
#include
voidmain()
{
intk,flag=1;
doubles,eps,item;
do{
printf("Inputeps:
");
scanf("%lf",&eps);
}while(eps<=0);//如果eps不是正数就重新输入
//求算式,第k项的分母是3k+1,分子是1或-1
k=1,s=0;
do{
item=flag*1.0/(3*k+1);
sum+=item;
k++;
flag=-flag;
}while(fabs(item)>=eps);
printf("s=%f\n",s);
}
2./*输入一批整数,以0或负数为结束标志,求其中的偶数之和*/
#include
voidmain()
{
intd,sum=0;
//输入一批整数,以0或负数为结束标记
printf("Inputintegers:
\n");
scanf("%d",&d);//输入第一个整数
while(d>0){//如果输入的整数d小于等于0,则结束循环
if(d%2==0)sum+=d;//如果n是偶数,累加至sum,也可写为if(!
(d%2))
scanf("%d",&d);//输入下一个整数
}
printf("sum=%d\n",sum);
}
3./*输入一个正整数n,计算下式的前n项之和(保留2位小数)。
*/
#include
voidmain()
{
ints=0,n,i,j,f;
//输入一个整数n,用于指定加数项的个数
printf("Inputintegers:
\n");
scanf("%d",&n);
//用外层循环for(i…)实现累加,第i个加数项为1.0/i!
用内层循环for(j…)实现求阶乘f=i!
for(i=1;i<=n;i++){
f=1;
for(j=1;j<=i;j++)
f*=j;
s+=1.0/f;//注意:
为何分子取实数1.0而不取整数1?
}
printf("sum=%d\n",s);
}
4./*输入一个实数x,计算下式的值,直到最后一项的绝对值小于10-5,即0.00001(保留2位小数)*/
//定义函数fact(n),用于返回整数n的阶乘
doublefact(intn)
{
intk;
doubleresult=1;
for(k=1;k<=n;k++)
result*=k;
returnresult;
}
//定义函数mypow(x,n),用于计算xn.
doublemypow(doublex,intn)
{
intk;
doubleresult=1;
for(k=1;k<=n;k++)
result*=x;
returnresult;
}
//当函数定义在main()主函数之前,不需要再进行函数说明
#include
voidmain()
{
inti;
doublex,s,item;
//输入实数x
printf("Inputeps:
");
scanf("%lf",&x);
//求算式,为便于归结,第一项从-1/4开始,第k项的分母是3k+1,分子是pow(-1,k)
i=1,s=1;
do{
item=mypow(x,i)/fact(i);
sum+=item;
i++;
}while(fabs(item)>=0.00001);
printf("s=%2f\n",s);
}
5./*输入一个正整数n,再输入n个整数,输出最小值。
*/
#include
voidmain()
{
intn,i,d,min;
//输入n(n>0),作为整数的个数
do{
printf("Inputnumberofintegersn:
\n");
scanf("%d",&n);
}while(n<=0);
//输入n个整数
printf("Input%dintegers:
\n",n);//提示信息
scanf("%d",&min);//输入第一个整数,并将该整数设为当前最小值
for(i=2;i<=n;i++)//输入第2~n个整数,并与当前最小值做比较
scanf("%d",&d);
if(dprintf("min=%d\n",min);
}
6./*输入一个整数number,求它的位数和各位数字之和。
如523的位数是3,各位数字和是10*/
#include
voidmain()
{
intnumber,sum=0,count=0,d;
//输入number
printf("Inputnumber:
\n");
scanf("%d",&number);
//number若是负数,取其相反数
if(number<0)
number=-number;
//从低向高逐步分解number的数字,并同时统计数位count、求各位数字和sum
do{
d=number%10;//d:
当前number的最低位数字
sum+=d;
count++;//count:
number的位数
number\=10;//调整number,
}while(number!
=0);
printf("sum=%d,count=%d\n",sum,count);
}
7./*输入一个正整数n,求2/1+3/2+5/3+…的前n项之和,保留2位小数*/
#include
voidmain()
{
intn,i;
doubles=0,a,b,c;
//输入正整数n
do{
printf("Inputnumberofintegersn:
\n");
scanf("%d",&n);
}while(n<=0);
//求2/1+3/2+5/3+8/5+…的前n项之和
for(a=2,b=1,s=0,i=1;i<=n;i++){//用逗号运算把几个赋值语句并在了一起
sum+=a/b;
c=b,b=a,a=a+c;//调整下一项的分子分母
}
printf("s=%.2f\n",s);
}
8./*输入2个正整数a和n,求a+aa+。
。
。
+aa…a,如输入2和3,则输出246(2+22+222)*/
算法分析:
函数分工:
主函数main()负责输入a和n,循环调用fn(),即fn(a,1),fn(a,2),…fn(a,n),并求累加和,输出累加和;函数fn(a,n)负责计算并返回由n位a组成的整数
#include
intfn(inta,intn);
voidmain()
{inta,n,i,sum=0;
//输入正整数a和n
do{
printf("Inputa(a>0):
");scanf("%d",&a);
printf("Inputn(n>0):
");scanf("%d",&n);
}while(a<=0||n<=0);//如果输入的a、n不都是正数,重新再输入,直到a和n均为正数为止
//求a+aa+…+aa…a,即fn(a,1)+fn(a,2)+…+fn(a,n)
for(i=1;i<=n;i++)
sum=sum+fn(a,i);
printf("sum=%d\n",sum);
}
//定义函数fn(a,n),返回由n位a组成的整数aa…a
intfn(inta,intn)
{intk,result=0;
for(k=1;k<=n;k++)
result=result*10+a;
returnresult;
}
9./*输出100~200之间的素数,每行输出8个*/
#include
#include
intprime(intn);
voidmain()
{
inti,j,count;
//输出100~200之间的素数
for(i=100;i<=200;i++)
if(prime(i)){
printf("%4d",i);//输出
count++;
if(count%8==0)printf("\n");
}
}
//定义函数prime(n),判断n是否为素数,是则返回1,不是则返回0
intprime(intn)
{
inti;
for(i=2;i<=sqrt(n);i++)
if(n%i==0)break;
if(i>sqrt(n))return1;//该if语句可用语句return(i>n/2?
1:
0);或更简单的return(i>n/2);替代
elsereturn0;
}
10./*输入两个正整数m,n(1<=m//先定义函数prime(n),判断n是否为素数,是则返回1,不是则返回0
intprime(intn)
{
inti;
for(i=2;i<=sqrt(n);i++)
if(n%i==0)break;
if(i>sqrt(n))return1;
elsereturn0;
}
#include
#includevoidmain()
{
intm,n,i,count,sum;
//输入整数m和n(1<=mdo{
printf("Inputm&n(1<=m");
scanf("%d%d",&m,&n);
}while(m<1||n<1||m>500||n>500||m>n);
//求m~n之间的素数的个数和累加和
sum=count=0;
for(i=m;i<=n;i++)
if(prime(i)){
count++;
sum+=i;
}
}
11./*用一张一元票换1分、2分和5分硬币(至少各1枚),问有几种换法?
各几枚?
*/
#include
voidmain()
{
intx,y,z,count=0;//x:
1分币y:
2分币z:
5分币
for(x=1;x<=100;x++)
for(y=1;y<=100/2;y++)
for(z=1;z<=100/5;z++)
if(x+2*y+5*z==100){
count++;
printf(“1:
%3d,2:
%3d,5:
%3d\n”,x,y,z);
}
printf(“count=%d\n”,count);
}
12./*输出1~10000之间所有满足各位数字的立方和与它本身相等的数。
如153=1*1*1+5*5*5+3*3*3.*/
算法分析:
1.函数分工:
主函数main()负责输入m和n,用循环for(i=m;i<=n;i++)…输出其中的数字立方和等于本身的整数,为了判断整数i是否是满足该条件,需调用is(i),;函数is(number)负责对number分解各个数位上的数字,并求出这些数字的立方和
源程序:
#include
intis(intnumber);
voidmain()
{inti,temp;
for(i=1;i<=10000;i++)//输出m~n之间的数字立方和等于它本身的整数
if(is(i))printf("%6d",i);
}
//定义函数is(number),判断整数number的数字立方和是否等于它本身,是则返回1,不是则返回0
intis(intnumber)
{intsum=0,p,k;
p=number;//保存number的原值
//从低位到高位,逐个析解number各位上的数字,并求立方和sum
while(number!
=0){//循环条件也可写为number
k=number%10;//k是当前最低位上的数字
sum+=k*k*k;//累加立方和
number/=10;//调整number,去掉最低位
}
return(sum==p);//返回关系表达式sum==p的值,两者相等,返回1,不等则返回0
}
13./*验证哥德巴赫猜想:
任何一个大于6的偶数均可表示为2个素数之和。
验证方法:
将6~100之间的偶数全部表示为两个素数之和,如6=3+3,输出时5组一行*/
算法分析:
函数prime(n),它的功能是判断n是否是素数。
主函数main()用循环for(k=6;k<=100;k++)实现以下功能:
如果k是偶数(k%2==0),则将在[2,i]的范围内找两个素数a和b,要求它们的和正好等于k,即a+b==k。
用试探法实现:
a在区间[2,k]中先取定一个值,则b必为k-a,检查a、b是否都是素数,是则打印k=a+b,并停止试探,否则a另取值继续试探
源程序:
#include
#include
intprime(intn);
voidmain()
{inta,b,k;
for(k=6;k<=100;k+=2){//逐个处理6~100之间的偶数k
for(a=3;ab=k-a;
if(prime(a)&&prime(b))break;//如果a,b同为素数,跳出内层循环
}
printf("%d=%d+%d",k,a,b);//输出k=a+b
if(k%5==0)printf("\n");//每行输出5组
}//外层循环
}
//自定义函数prime(n),判断整数n是否是素数,是则返回1,不是则返回0
intprime(intn)
{inti;
for(i=2;i<=sqrt(n);i++)
if(n%i==0)break;
if(i>sqrt(n))
return1;//n是素数,返回1
else
return0;//若为假,n不是素数返回0
}
14./*输入一个长整数,从高位开始逐位分割各位数字,如输入27358,则输出2,7,3,5,8*/--2007年春笔试真题
算法分析:
在第6题中求各位数字时是从低位开始逐位分割,而本题要求从高位开始分割,因此两题的求救方法有所区别。
本题的求解思路如下:
假设输入的整数为number(27358)
首先求出最高位的权重power(number是几位数,最高为权重就是10的几次方);如在27358中,最高位权重是10000;
然后求最高位——万位数,方法是digit=number/power=27358/10000,按此方法得到2,予以输出。
为下一个数字——千位数做调整:
去掉当前被除数number的最高位2,保留低位,即number%=power:
27358%10000=7358;缩小权重power,即power/=101000。
千位数字为digit=number/power=7358/1000=7,输出。
为下一个数字——百位数做调整:
抛弃当前被除数number中的最高位7,即number%=power:
7358%1000358;缩小权重power/=10—>100
百位数字为digit=number/power=358/000=3,输出。
为下一个数字——十位数做调整:
抛弃当前被除数number中的最高位3,即number%=power:
358%10058;缩小权重power/=10—>10
十位数字为digit=number/power=58/10=5,输出。
为下一个数字——个位数做调整:
抛弃当前被除数number中的最高位5,即number%=power:
58%108;缩小权重power/=10—>1
个位数字为digit=number/power=8/1=8,输出。
为下一个数字——?
位数做调整:
抛弃当前被除数number中的最高位8,即number%=power:
8%10;缩小权重power/=10—>0
此时,当前被除数number==0,意味着最低位已经分解完毕,应当停止如上的循环操作,故循环条件是while(number!
=0)或while(number)
源程序:
#include
voidmain()
{intdigit,k,power,t,number;
printf("Enteraninteger:
");scanf("%d",&number);//输入整数number
if(number<0)number=-number;//如果number为负数,取其相反数
//求number的位数:
k
t=number;/*line7:
复制number到t*/
k=0;
do{
k++;
t=t/10;
}while(t!
=0);
//求最高位的权重:
power=10k-1
power=1;
for(i=1;ipower=power*10;
//从最高开始,逐位分解数字
printf("Thedigitsare:
");
while(number!
=0){
digit=number/power;//求当前被除数的最高位数字
printf("%3d",digit);
number=number%p;//抛弃最高位
power=power/10;//缩小权重
}
printf("\n");
}
15./*输入一个正整数,分解质因数。
如输入90,输出90=2*3*3*5*/
算法分析:
给定整数number,求number的所有质因子,即在区间[2,number]中寻找一个能整除number的素数factor,然后用该质因子factor除以number,形成一个新的被除数,即number/=factor,重复寻找—除以因子的过程,直到该被除数number等于1,结束以上循环过程
源程序:
#include
voidmain()
{intm,i,factor;
//输入正整数number
do{printf("Inputaninterger:
");
scanf("%d",&number);
while(number<=0);//如果输入的number不符合题意,重新再输入
printf(“%d=”,number);
//对number分解质因子,循环条件是被除数number大于1
while(number>1){//
//寻找number的一个质因子factor(取值范围是2~number)
for(factor=2;factor<=number;factor++){
if(number%factor==0){//如果factor能整除number,检查factor是否是质数(即素数)
for(i=2;i<=factor/2;i++)
if(factor%i==0)break;//如果i能整除i,结束for(i...)循环
if(i>factor/2)break;//如果factor是质数,结束for(k...)循环
}
}//循环for(k...)结束,此时k是number的某个质因子
printf(“%d*”,number);//输出该质因子
number/=factor;//每次循环都会使number变小
}
}
16./*输入两个正整数m,n,求最大公约数与最小公倍数*/
#include
voidmain()
{
intm,n,p,q;
//输入正整数m和n
do{
printf("Inputm&n(m>0,n>0):
");
scanf("%d%d",&m,&n);
}while(m<=0||n<=0);
//求m,n的最大公约数p
p=mm:
n;//p取m,n中较小者
while(m%p!
=0&&n%p!
=0)p--;//不是公约数之前,q逐渐减小
//求m,n的最小公倍数q
q=m>n?
m:
n;//q取m,n中较大者
while(q%m!
=0||q%m!
=0)q++;//不是公倍数之前,q逐渐增大
printf("p=%d,q=%d\n",p,q);
}
17./*一球从100米高度自由下落,每次落地后反跳回原高度的一半,再落下。
求它在第10次落地时,共经过几米?
第10次反弹高度是几米?
*/
算法分析:
次数
1
2
3
4
5
6
7
8
9
10
落地(m)
100
50
25
12.5
6.25
3.125
1.5625
0.78125
0.390625
0.1953125
反弹(m)
50
25
12.5
6.25
3.125
1.5625
0.78125
0.390625
0.1953125
0.09765625