C语言程序设计第三版谭浩强主编第68章课后习题答案.docx

上传人:b****6 文档编号:8627085 上传时间:2023-02-01 格式:DOCX 页数:59 大小:35.68KB
下载 相关 举报
C语言程序设计第三版谭浩强主编第68章课后习题答案.docx_第1页
第1页 / 共59页
C语言程序设计第三版谭浩强主编第68章课后习题答案.docx_第2页
第2页 / 共59页
C语言程序设计第三版谭浩强主编第68章课后习题答案.docx_第3页
第3页 / 共59页
C语言程序设计第三版谭浩强主编第68章课后习题答案.docx_第4页
第4页 / 共59页
C语言程序设计第三版谭浩强主编第68章课后习题答案.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

C语言程序设计第三版谭浩强主编第68章课后习题答案.docx

《C语言程序设计第三版谭浩强主编第68章课后习题答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第三版谭浩强主编第68章课后习题答案.docx(59页珍藏版)》请在冰豆网上搜索。

C语言程序设计第三版谭浩强主编第68章课后习题答案.docx

C语言程序设计第三版谭浩强主编第68章课后习题答案

C语言第6—8章课后习题答案

第六章循环语句

6.1输入两个正数,求最大公约数和最小公倍数.

#include

voidmain()

{inta,b,num1,num2,temp;

printf("请输入两个正整数:

\n");

scanf("%d,%d",&num1,&num2);

if(num1

{

temp=num1;

num1=num2;

num2=temp;

}

a=num1,b=num2;

while(b!

=0)

{

temp=a%b;

a=b;

b=temp;

}

printf("它们的最大公约数为:

%d\n",a);

printf("它们的最小公倍数为:

%d\n",num1*num2/a);

}

编译已通过

6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.

解:

#include

voidmain()

{

charc;

intletters=0,space=0,degit=0,other=0;

printf("请输入一行字符:

\n");

while((c=getchar())!

='\n')

{

if(c>='a'&&c<='z'||c>'A'&&c<='Z')

letters++;

elseif(c=='')

space++;

elseif(c>='0'&&c<='9')

digit++;

else

other++;

}

printf("其中:

字母数=%d空格数=%d数字数=%d其它字符数=%d\n",letters,space,digit,other);

}

6.3求s(n)=a+aa+aaa+…+aa…a之值,其中a是一个数字,n表示a的位数。

解:

voidmain()

{

inta,n,count=1,sn=0,tn=0;

printf("请输入a和n的值:

\n");

scanf("%d,%d",&a,&n);

printf("a=%dn=%d\n",a,n);

while(count<=n)

{

tn=tn+a;

sn=sn+tn;

a=a*10;

++count;

}

printf("a+aa+aaa+…=%d\n",sn);

}

6.4求(即1+2!

+3!

+4!

+…+20!

voidmain()

{

floatn,s=0,t=1;

for(n=1;n<=20;n++)

{

t=t*n;

s=s+t;

}

printf("1!

+2!

+…+20!

=%e\n",s);

}

阶乘利用递归,再求和:

#include

usingnamespacestd;

longFunc(intn)

{

if(1==n)

returnn;

if(n>1)

returnn*Func(n-1);

}

main()

{

longs=0;

inti=1;

while(i<=6)

{

s=s+Func(i);

i++;

}

cout<

}

6.5求。

voidmain()

{

intk,N1=100,N2=50,N3=10;

floats1=0.0,s2=0.0,s3=0.0;

for(k=1;k<=N1;k++)/*计算1到100的和*/

{

s1=s1+k;

}

for(k=1;k<=N2;k++)/*计算1到50各数平方和*/

{

s2=s2+k*k;

}

for(k=1;k<=N3;k++)/*计算1到10各数倒数之和*/

{

s3=s3+1.0/k;

}

printf("总和=%8.2f\n",s1+s2+s3);

}

已通过

intmain()

{

intk=1,i=11,j=51;

floats=0.0;

while(k<=10)

{

s=s+k+k*k+1.0/k;

while(k==10&&i<=50)

{

s=s+i+i*i;

while(i=50&&j<=100)

{

s=s+j;

j++;

}

i++;

}

k++;

}}

6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。

#include

voidmain()

{

inti,j,k,n;

printf("水仙花数是:

\n");

for(n=100;n<1000;n++)

{

i=n/100;

j=n/10-i*10;

k=n%10;

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

{

printf("%d\n",n);

}

}

printf("\n");

}

编译已通过153370371407

6.7一个数如果恰好等于它的因子之和,这个数就称为“完数”。

编程序找出1000之内的所有完数,并按下面格式输出其因子。

#include

#defineM1000/*定义寻找范围*/

voidmain()

{

intk0,k1,k2,k3,k4,k5,k6,k7,k8,k9;

inti,j,n,s;

for(j=2;j<=M;j++)

{

n=0;s=j;

for(i=1;i

{

if((j%i)==0)

{

n++;

s=s-i;

switch(n)/*将每个因子赋给k0,k1…k9*/

{

case1:

k0=i;break;

case2:

k1=i;break;

case3:

k2=i;break;

case4:

k3=i;break;

case5:

k4=i;break;

case6:

k5=i;break;

case7:

k6=i;break;

case8:

k7=i;break;

case9:

k8=i;break;

case10:

k9=i;break;

}}}

if(s==0)

{

printf("%d是一个完数,它的因子是",j);

if(n>1)

printf("%d,%d",k0,k1);

if(n>2)

printf(",%d",k2);

if(n>3)

printf(",%d",k3);

if(n>4)

printf(",%d",k4);

if(n>5)

printf(",%d",k5);

if(n>6)

printf(",%d",k6);

if(n>7)

printf(",%d",k7);

if(n>8)

printf(",%d",k8);

if(n>9)

printf(",%d",k9);

printf("\n");

}}}

方法二:

此题用数组方法更为简单.

voidmain()

{intk[10];

inti,j,n,s;

for(j=2;j<=1000;j++)

{

n=-1;

s=j;

for(i=1;i

{

if((j%i)==0)

{

n++;

s=s-i;

k[n]=i;/*将每个因子赋给k0,k1...k9*/

}

}

if(s==0)

{

printf("%d是一个完数,它的因子是:

",j);

for(i=0;i

printf("%d,",k[i]);

printf("%d\n",k[n]);

}}}

6.8有一个分数序列:

2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和.

解:

#include

voidmain()

{

intn,t,number=20;

floata=2,b=1,s=0;

for(n=1;n<=number;n++)

{

s=s+a/b;

t=a,a=a+b,b=t;

}

printf("总和=%9.6f\n",s);

}

编译已通过=32.

6.9球反弹问题

#include

voidmain()

{

floatsn=100.0,hn=sn/2;

intn;

for(n=2;n<=10;n++)

{

sn=sn+2*hn;/*第n次落地时共经过的米数*/

hn=hn/2;/*第n次反跳高度*/

}

printf("第10次落地时共经过%f米\n",sn);

printf("第10次反弹%f米.\n",hn);

}

编译已通过

经过299.m

反弹0.m

6.10猴子吃桃问题

#include

voidmain()

{

intday,x1,x2;

day=9;

x2=1;

while(day>0)

{

x1=(x2+1)*2;

x2=x1;

day--;

}

printf("桃子总数=%d\n",x1);

}

编译已通过=1534

上面的程序是从最后一天计算,一直到第一天。

当while第一次循环,既day=9的时候,X1此时计算的是第9天的桃子数。

而X2既是X1前一天的桃子数。

计算出第9天的桃子数后,把X1的值赋值给X2,那么X2此时X2就表示第9天的桃子数,再通过while的循环,可以逐步求出第7天,第6天...一直到第一天的桃子数.这里X2=X1,就是一个赋值的过程,为的是求前一天的桃子数.

6.11用迭代法求x=。

求平方根的迭代公式为:

要求前后两次求出的差的绝对值小于0.00001。

#include

#include

voidmain()

{

floatx0,x1,a;

scanf("%f",&a);

x1=a/2;

do

{

x0=x1;

x1=(x0+a/x0)/2;

}while(fabs(x0-x1)>=0.00001);

printf("%.3f\n",x1);

}编译已通过

6.12用牛顿迭代法求方程在1.5附近的根。

#include

voidmain()

{

doublex,y;x=1.5;

do

{

y=2*x*x*x-4*x*x+3*x-6;

x=x-y/(6*x*x-8*x+3);

}while(y!

=0);

printf("x=%.3f\n",x);

}编译已通过x=2.000

6.13用二分法求方程在(-10,10)之间的根:

#include

voidmain()

{

doublex1,x2,y1,y2;x1=-10;x2=10;

do

{

y1=2*x1*x1*x1-4*x1*x1+3*x1-6;

x1=x1-y1/(6*x1*x1-8*x1+3);

}while(y1!

=0);

do

{

y2=2*x2*x2*x2-4*x2*x2+3*x2-6;

x2=x2-y2/(6*x2*x2-8*x2+3);

}while(y2!

=0);

printf("x1=%.3f,x2=%.3f\n",x1,x2);

}

编译已通过

x1=2.000,x2=2.000

6.14打印图案

#include

voidmain()

{

inti,j,k;

for(i=0;i<=3;i++)

{

for(j=0;j<=2-i;j++)

printf("");

for(k=0;k<=2*i;k++)

printf("*");

printf("\n");

}

for(i=0;i<=2;i++)

{

for(j=0;j<=i;j++)

printf("");

for(k=0;k<=4-2*i;k++)

printf("*");

printf("\n");

}}

编译已通过

6.15乒乓比赛

#include

voidmain()

{

chari,j,k;/*i是a的对手;j是b的对手;k是c的对手*/

for(i='x';i<='z';i++)

{

for(j='x';j<='z';j++)

{

if(i!

=j)

for(k='x';k<='z';k++)

{

if(i!

=k&&j!

=k)

{

if(i!

='x'&&k!

='x'&&k!

='z')

printf("顺序为:

\na--%c\tb--%c\tc--%c\n",i,j,k);

}}}}

}编译已通过

7.1用筛选法求100之内的素数.

/*用筛选法求100之内的素数*/

#include

#defineN101

voidmain()

{inti,j,line,a[N];

for(i=2;i

6for(i=2;i

for(j=i+1;j

{if(a[i]!

=0&&a[j]!

=0)

if(a[j]%a[i]==0)

a[j]=0;

11printf("\n");

for(i=2,line=0;i

{if(a[i]!

=0)

{printf("%5d",a[i]);

line++;

if(line==10)

{printf("\n");

line=0;}

}

21}

6,11,21没通过

7.2用选择法对10个数排序.

/*选择法排序.*/

#include

#defineN10

voidmain()

{inti,j,min,temp,a[N];

/*输入数据*/

printf("请输入十个数:

\n");

for(i=0;i

{printf("a[%d]=",i);

scanf("%d",&a[i]);

}

printf("\n");

for(i=0;i

printf("%5d",a[i]);

printf("\n");

/*排序*/

for(i=0;i

{min=i;

for(j=i+1;j

if(a[min]>a[j])min=j;

temp=a[i];

a[i]=a[min];

a[min]=temp;

}

/*输出*/

printf("\n排序结果如下:

\n");

for(i=0;i

printf("%5d",a[i]);

}

编译已通过

7.3对角线和:

/*计算矩阵对角线元素之和*/

#include

#include

voidmain()

{

inta[3][3];

inti,j;//i为行j为列

intsum=0;

intsum1=0;

//输入

for(i=0;i<=2;i++)

{

for(j=0;j<=2;j++)

{

printf("请输入第%d行第%d列的数:

",i+1,j+1);

scanf("%d",&a[i][j]);

}

printf("\n");

}

//求和

for(i=0;i<=2;i++)

{

for(j=0;j<=2;j++)

{

if(i==j)

sum=sum+a[i][j];

if(i+j==2)

sum1=sum1+a[i][j];

}}

7.4插入数据到数组

/*插入数据到数组*/

#include

voidmain()

{

inta[11]={1,3,6,9,13,15,19,27,30,80};

inttemp1,temp2,number,end,i,j;

printf("初始数组如下:

");

for(i=0;i<10;i++)

printf("%5d",a[i]);

printf("\n");

printf("输入插入数据:

");

scanf("%d",&number);

end=a[9];

if(number>end)

a[10]=number;

else

{

for(i=0;i<10;i++)

{

if(a[i]>number)

{

temp1=a[i];

a[i]=number;

for(j=i+1;j<11;j++)

{

temp2=a[j];

a[j]=temp1;

temp1=temp2;

}

break;

}}}

for(i=0;i<11;i++)

printf("%6d",a[i]);

printf("\n");

}编译已通过

7.5将一个数组逆序存放。

/*数组逆序存放*/

#include

#defineN5

voidmain()

{

inta[N]={8,6,5,4,1},i,temp;

printf("\n初始数组:

\n");

for(i=0;i

printf("%4d",a[i]);

for(i=0;i

{

temp=a[i];

a[i]=a[N-i-1];

a[N-i-1]=temp;

}

printf("\n交换后的数组:

\n");

for(i=0;i

printf("%4d",a[i]);

}无错误

7.6杨辉三角

/*打印杨辉三角形*/

#include

#defineN10

voidmain()

{

inti,j,a[N][N];

for(i=0;i

{

a[i][i]=1;

a[i][0]=1;

}

for(i=2;i

for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i

{

for(j=0;j<=i;j++)

printf("%6d",a[i][j]);

printf("\n");

}

printf("\n");

}

7.8鞍点

/*查找鞍点*/

#defineN10

#defineM10

main()

{inti,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;

printf("\n输入行数n:

");

scanf("%d",&n);

printf("\n输入列数m:

");

scanf("%d",&m);

for(i=0;i

{printf("第%d行?

\n",i);

for(j=0;j

scanf("%d",&a[i][j];

}

for(i=0;i

{for(j=0;j

printf("%5d",a[i][j]);

pritf("\n");

}

flag2=0;

for(i=0;i

{max=a[i][0];

for(j=0;j

if(a[i][j]>max)

{max=a[i][j];

maxj=j;

}

for(k=0,flag1=1;k

if(max>a[k][max])

flag1=0;

if(flag1)

{printf("\n第%d行,第%d列的%d是鞍点\n",i,maxj,max);

flag2=1;

}}

if(!

flag2)

printf("\n矩阵中无鞍点!

\n");

}

7.9变量说明:

top,bott:

查找区间两端点的下标;loca:

查找成功与否的开关变量.

/*折半查找*/

#include

#defineN15

main()

{inti,j,number,top,bott,min,loca,a[N],flag;

charc;

printf("输入15个数(a[i]>[i-1])\n);

scanf("%d",&a[0]);

i=1;

while(i

{scanf("%d",&a[i]);

if(a[i]>=a[i-1])

i++;

esle

{printf("请重输入a[i]");

printf("必须大于%d\n",a[i-1]);

}

}

printf("\n");

for(i=0;i

printf("%4d",a[i]);

printf("\n");

flag=1;

while(flag)

{

printf("请输入查找数据:

");

scanf("%d",&number);

loca=0;

top=0;

bott=N-1;

if((numbera[N-1]))

loca=-1;

while((loca==0)&&(top<=bott))

{min=(bott+top)/2;

if(number==a[min])

{loca=min;

printf("%d位于表中第%d个数\n",number,loca+1);

}

elseif(number

bott=min-1;

else

top=min+1;

}

if(loca==0||loca==-1)

printf("%d不在表中\n",number);

printf("是否继续查找?

Y/N!

\n");

c=getchar();

if(c=='N'||c=='n')

flag=0;

}

}

7.10/*统计字符数*/

#include

voidmain()

{inti,j,uppn,lown,dign,sp

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

当前位置:首页 > 高等教育 > 农学

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

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