《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx

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

《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx

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

《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx

//如果n是偶数,累加至sum,也可写为if(!

(d%2))

//输入下一个整数

}

sum=%d\n"

sum);

3./*输入一个正整数n,计算下式的前n项之和(保留2位小数)。

*/

ints=0,n,i,j,f;

//输入一个整数n,用于指定加数项的个数

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?

s);

4./*输入一个实数x,计算下式的值,直到最后一项的绝对值小于10-5,即0.00001(保留2位小数)*/

//定义函数fact(n),用于返回整数n的阶乘

doublefact(intn)

{

intk;

doubleresult=1;

for(k=1;

k<

k++)

result*=k;

returnresult;

//定义函数mypow(x,n),用于计算xn.

doublemypow(doublex,intn)

intk;

result*=x;

//当函数定义在main()主函数之前,不需要再进行函数说明

inti;

doublex,s,item;

//输入实数x

x);

//求算式,为便于归结,第一项从-1/4开始,第k项的分母是3k+1,分子是pow(-1,k)

i=1,s=1;

item=mypow(x,i)/fact(i);

i++;

=0.00001);

s=%2f\n"

5./*输入一个正整数n,再输入n个整数,输出最小值。

intn,i,d,min;

//输入n(n>

0),作为整数的个数

printf("

Inputnumberofintegersn:

}while(n<

//输入n个整数

Input%dintegers:

n);

//提示信息

scanf("

min);

//输入第一个整数,并将该整数设为当前最小值

for(i=2;

i++)//输入第2~n个整数,并与当前最小值做比较

if(d<

min)min=d;

min=%d\n"

min);

6./*输入一个整数number,求它的位数和各位数字之和。

如523的位数是3,各位数字和是10*/

intnumber,sum=0,count=0,d;

//输入number

Inputnumber:

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

sum=%d,count=%d\n"

sum,count);

7./*输入一个正整数n,求2/1+3/2+5/3+…的前n项之和,保留2位小数*/

intn,i;

doubles=0,a,b,c;

//输入正整数n

//求2/1+3/2+5/3+8/5+…的前n项之和

for(a=2,b=1,s=0,i=1;

i++){//用逗号运算把几个赋值语句并在了一起

sum+=a/b;

c=b,b=a,a=a+c;

//调整下一项的分子分母

}

s=%.2f\n"

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组成的整数

intfn(inta,intn);

{inta,n,i,sum=0;

//输入正整数a和n

Inputa(a>

0):

a);

Inputn(n>

}while(a<

=0||n<

//如果输入的a、n不都是正数,重新再输入,直到a和n均为正数为止

//求a+aa+…+aa…a,即fn(a,1)+fn(a,2)+…+fn(a,n)

for(i=1;

i++)

sum=sum+fn(a,i);

sum);

//定义函数fn(a,n),返回由n位a组成的整数aa…a

intfn(inta,intn)

{intk,result=0;

for(k=1;

k<

result=result*10+a;

9./*输出100~200之间的素数,每行输出8个*/

intprime(intn);

inti,j,count;

//输出100~200之间的素数

for(i=100;

=200;

i++)

if(prime(i)){

%4d"

i);

//输出

count++;

if(count%8==0)printf("

//定义函数prime(n),判断n是否为素数,是则返回1,不是则返回0

intprime(intn)

for(i=2;

=sqrt(n);

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<

n<

=500),统计并输出m~n之间的素数的个数和这些素数的和*/

//先定义函数prime(n),判断n是否为素数,是则返回1,不是则返回0

math.h

intm,n,i,count,sum;

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

=500)

Inputm&

n(1<

=500):

%d%d"

m,&

}while(m<

1||n<

1||m>

500||n>

500||m>

//求m~n之间的素数的个数和累加和

sum=count=0;

for(i=m;

count++;

sum+=i;

11./*用一张一元票换1分、2分和5分硬币(至少各1枚),问有几种换法?

各几枚?

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++)…输出其中的数字立方和等于本身的整数,为了判断整数i是否是满足该条件,需调用is(i),;

函数is(number)负责对number分解各个数位上的数字,并求出这些数字的立方和

源程序:

intis(intnumber);

{inti,temp;

for(i=1;

=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++)实现以下功能:

如果k是偶数(k%2==0),则将在[2,i]的范围内找两个素数a和b,要求它们的和正好等于k,即a+b==k。

用试探法实现:

a在区间[2,k]中先取定一个值,则b必为k-a,检查a、b是否都是素数,是则打印k=a+b,并停止试探,否则a另取值继续试探

intprime(intn);

{inta,b,k;

for(k=6;

k+=2){//逐个处理6~100之间的偶数k

for(a=3;

a<

k;

a++){//为特定的k,寻找素数加数项a

b=k-a;

if(prime(a)&

&

prime(b))break;

//如果a,b同为素数,跳出内层循环

}

%d=%d+%d"

k,a,b);

//输出k=a+b

if(k%5==0)printf("

//每行输出5组

}//外层循环

//自定义函数prime(n),判断整数n是否是素数,是则返回1,不是则返回0

intprime(intn)

{inti;

for(i=2;

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;

10

十位数字为digit=number/power=58/10=5,输出。

为下一个数字——个位数做调整:

抛弃当前被除数number中的最高位5,即number%=power:

58%108;

1

个位数字为digit=number/power=8/1=8,输出。

为下一个数字——?

位数做调整:

抛弃当前被除数number中的最高位8,即number%=power:

8%10;

此时,当前被除数number==0,意味着最低位已经分解完毕,应当停止如上的循环操作,故循环条件是while(number!

=0)或while(number)

#include<

voidmain()

{intdigit,k,power,t,number;

Enteraninteger:

//输入整数number

if(number<

0)number=-number;

//如果number为负数,取其相反数

//求number的位数:

k

t=number;

/*line7:

复制number到t*/

k=0;

do{

k++;

t=t/10;

}while(t!

//求最高位的权重:

power=10k-1

power=1;

i++)

power=power*10;

//从最高开始,逐位分解数字

Thedigitsare:

while(number!

=0){

digit=number/power;

//求当前被除数的最高位数字

%3d"

digit);

number=number%p;

//抛弃最高位

power=power/10;

//缩小权重

15./*输入一个正整数,分解质因数。

如输入90,输出90=2*3*3*5*/

给定整数number,求number的所有质因子,即在区间[2,number]中寻找一个能整除number的素数factor,然后用该质因子factor除以number,形成一个新的被除数,即number/=factor,重复寻找—除以因子的过程,直到该被除数number等于1,结束以上循环过程

{intm,i,factor;

//输入正整数number

do{printf("

Inputaninterger:

%d"

while(number<

//如果输入的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;

=factor/2;

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,求最大公约数与最小公倍数*/

intm,n,p,q;

//输入正整数m和n

n(m>

0,n>

//求m,n的最大公约数p

p=m<

n?

m:

n;

//p取m,n中较小者

while(m%p!

=0&

n%p!

=0)p--;

//不是公约数之前,q逐渐减小

//求m,n的最小公倍数q

q=m>

//q取m,n中较大者

while(q%m!

=0||q%m!

=0)q++;

//不是公倍数之前,q逐渐增大

p=%d,q=%d\n"

p,q);

17./*一球从100米高度自由下落,每次落地后反跳回原高度的一半,再落下。

求它在第10次落地时,共经过几米?

第10次反弹高度是几米?

次数

2

3

4

5

6

7

8

9

落地(m)

50

25

12.5

6.25

3.125

1.5625

0.78125

0.390625

0.1953125

反弹(m)

0.09765625

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

当前位置:首页 > 解决方案 > 学习计划

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

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