《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx
《《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
![《C语言程序设计》浙江科学技术版 习题参考答案习题4Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/3/9e4e5342-b774-42e4-ae47-b75809d499c9/9e4e5342-b774-42e4-ae47-b75809d499c91.gif)
//如果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