《C语⾔程序设计》第4版何钦铭、颜晖主编课后习题答案第6
章习题6
P147~149
⼀、选择题
1~6  D A  C D C B
⼆、填空题
1、1000000001111111  1111111110000000    1111111110000001
2、6
3、1  0  1  1
4、x!=0
5、135
三、程序设计题
1题
#include<stdio.h>
int main(void)
{
/*分类统计字符个数(习题6.1)*/{
char ch;
int letter=0,digit=0,blank=0,other=0;
printf("输⼊⼀串字符:");
while(ch!='\n'){
scanf("%c",&ch);//可以加⼊getchar(); ⽤于读⼊并舍弃换⾏符,但此处是循环取值,不可以加,可参考课本P056 例3-7
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
letter++;
}
else if(ch>='0'&&ch<='9'){
digit++;
}
else if(ch==' '){
blank++;
}
else {
c语言斐波那契数列other++;//包括输⼊字符结束的那个回车
}
}
printf("letter=%d,digit=%d,blank=%d,other=%d\n\n",letter,digit,blank,other);}
return 0;
}
2题
int fn(int a,int n)
{
int i,sum1=0;
for(i=1;i<=n;i++)//当n=1时,循环只有i=1进去,循环体执⾏⼀次,判断条件执⾏两次(表达式2)。把循环体编为4,则执⾏顺序为:1,2,4,3,2跳出 {
sum1+=a;
a=a*10;
}
return sum1;
}
int main(void)
{
int n,a,sum=0;
printf("Enter a,n:");
scanf("%d%d",&a,&n);
while(n!=0){
sum+=fn(a,n);
n--;
}
printf("sum=%d",sum);
return 0;
}
3题
#include<stdio.h>//习题6.3
int factorsum(int number)
{
int i,sum=0;
for(i=1;i<=number/2;i++)
{
if(number%i==0){//number是i的倍数
sum+=i;
}
}
return sum;
}
int main(void)
{
int m,n,j,result=0;
printf("Enter m,n(m>=1,n<=10000):");
scanf("%d%d",&m,&n);
printf("%d~%d之间的完数为:",m,n);
for(j=m;j<=n;j++)
{
result=factorsum(j);
if(result==j){
printf("%6d",j);
}
}
return 0;
}
4题
/*int fib(int n)//返回斐波那契数列第n项
{//递归
if(n==1||n==2){//第⼀项和第⼆项结果都为1,返回1
return 1;
}
else return fib(n-1)+fib(n-2);//从第三项开始,等于前两项之和}*/
int fib(int n)//⾮递归,更易理解
{
int x1=1,x2=1,x=0,i;
if(n<3){
return 1;
}
else {
for(i=0;i<=n-3;i++)//只循环n-2次,当n=3时,x=3
{
x=x1+x2;
x1=x2;
x2=x;
}
return x;
}
}
void fibon(int m,int n)
{
int i,count=0;
for(i=1;fib(i)<=n;i++)//数列到<=n时终⽌循环,不然会死循环 {
if(fib(i)>=m){//固定在m~n之间
count++;//记录数列的项数
printf("%6d",fib(i));
}
}
if(count==0){
printf("No Fibonacci number\n");
}
}
int main(void)
{
int m,n,t;
printf("Enter m,n(m>=1,n<=10000),t:");
scanf("%d%d%d",&m,&n,&t);
printf("fib(%d)=%d\n",t,fib(t));
fibon(m,n);
return 0;
}
5题
#include<stdio.h>
#include<math.h>
int main(void)
{
/*使⽤函数验证哥德巴赫猜想(习题6.5)*/
int i,x1,x2,x,flag,j,k,l,flag1=0,flag2=0,count=0;
for(i=6;i<=20;i+=2)//可通过改变i的范围输出较少的数,可将表达式2改为i<=100,求6~100之间偶数的这种表达式 {                //这⾥因为简化输出,范围为6~20
flag=0;
x=i/2;//x1和x2分布在x的两侧 //排除2这个素数
for(j=2;j<i;j++)
{
for(l=2;l<=sqrt(j);l++)//保证j是素数
{
if(j%l==0){
flag1=0;
}
else flag1=1;
}
for(k=2;k<i;k++)
{
for(l=2;l<=sqrt(k);l++)//保证k是素数
{
if(k%l==0){
flag2=0;
}
else flag2=1;
}
if(i%2==0&&flag1==1&&flag2==1&&i==j+k&&(j<=k)&&j%2!=0&&k%2!=0){//条件太多,不符合规定
printf("%4d=%2d+%2d",i,j,k);//未能实现每个偶数只输出⼀次,可以限定i,输出⼀次后直接跳到下⼀个
//continue;
count++;
/
/ break;
}
}
}
if(count%5==0){//暂时未发现放哪能实现每5个⼀⾏
printf("\n");
}
else ;
//  if(flag==1){
//  break;
//  }
}
return 0;
}
6题
#include<stdio.h>//习题6.6
#include<math.h>
int reverse(int number)//缺点:传过来1000时,会返回1.本来可以⽤直接输出余数x的⽅法使结果变为0001,但这是⾃定义函数,要求返回逆序数,不可以多次输出{
int x,i,count=0,sum=0,number1,b=0;
number1=number;
do{
x=number1%10;
number1=number1/10;
count++;
}while(number1!=0);
count=count-1;
while(number!=0){
x=number%10;
number=number/10;
sum+=x*pow(10,count);
count--;            //此循环太繁琐了,16、17⾏可以改为sum=sum*10+x;上⾯的do~while和count=count-1也可以注释掉
}
return sum;
}
int main(void)
{
int number;
printf("Enter number:");
scanf("%d",&number);
printf("%d的逆序数为:%d",number,reverse(number));
return 0;
}
7题
#include<stdio.h>//简单计算器(习题6.7)
int main(void)
{
int a,b,sum=0;
char ch;
printf("输⼊⼀个算式:");
scanf("%d",&a);//取输⼊算式的第⼀个数
while((ch=getchar())!='='){
scanf("%d",&b);//取算式的第⼆个数,取算式的第三个数
switch(ch){//判断运算符
case '+':sum=a+b;break;//每次⼀个运算符就结束,再赋值,就能满⾜从左到右(从整个输⼊的那个⼤算式看),加减乘除看似违背先乘除再加减的法则
case '-':sum=a-b;break;
case '*':sum=a*b;break;
case '/':if(b!=0){
sum=a/b;
}break;
default:printf("error");return 0;//如果不是运算符直接结束程序
}
a=sum;//前两个数算完后,需要把sum赋给a再次进⼊循环
}
printf("%d",a);
return 0;
}
8题,我还没完全理解

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。