《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx

上传人:b****8 文档编号:9361176 上传时间:2023-02-04 格式:DOCX 页数:20 大小:29.47KB
下载 相关 举报
《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx_第1页
第1页 / 共20页
《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx_第2页
第2页 / 共20页
《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx_第3页
第3页 / 共20页
《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx_第4页
第4页 / 共20页
《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx

《《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx(20页珍藏版)》请在冰豆网上搜索。

《C语言程序设计》浙江科学技术版 习题参考答案习题4.docx

《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(d

printf("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

#include

voidmain()

{

intm,n,i,count,sum;

//输入整数m和n(1<=m

do{

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;a

b=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;i

power=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=m

m:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1