算法设计方法与优化滕国文部分课后习题答案docx精选文档文档格式.docx
《算法设计方法与优化滕国文部分课后习题答案docx精选文档文档格式.docx》由会员分享,可在线阅读,更多相关《算法设计方法与优化滕国文部分课后习题答案docx精选文档文档格式.docx(75页珍藏版)》请在冰豆网上搜索。
![算法设计方法与优化滕国文部分课后习题答案docx精选文档文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/24/fc6d1cfb-f76a-40c7-809a-b02e5f803489/fc6d1cfb-f76a-40c7-809a-b02e5f8034891.gif)
printf("
%d,%d,%d"
c,b,a);
voidmain()
inta,b,c;
inputnumber:
"
);
scanf("
%d%d%d"
&
a,&
b,&
c);
fun(a,b,c);
\n"
2-2.给定n个数,求这些数中的最大值。
#include
<
stdio.h>
void
main()
{
int
i,
j,
temp,n;
a[1000];
scanf("
%d"
n);
for
(i=0;
i<
9;
i++)
a[i]);
(j=0;
j<
n;
j++)
for(i=0;
n-j;
if
(a[i]
>
a[i
+
1])
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
printf("
%d\n"
a[n]);
2-3.求1+2+3+…+100的和。
#include"
intnum,sum=0;
for(num=1;
num<
=100;
num++)
sum+=num;
sum);
2-4.判断一个数n能否同时被3和5整数。
intfun(intn)
if(n%3==0&
&
n%5==0)
returnn;
else
return0;
2-5.将100至200之间的素数输出。
#include"
math.h"
intisp(intm)
inti;
for(i=2;
=sqrt(m);
if(m%i==0)
return0;
return1;
intn;
for(n=100;
n<
=200;
n++)
if(isp(n))
printf("
%d\t"
2-6.求两个数m和n的最大公约数。
intnum(intm,intn)
intr,t;
if(m<
n)
{t=m;
m=n;
n=t;
r=m%n;
while(r)
m=n;
n=r;
r=m%n;
returnn;
intx,y,s;
inputxandy:
%d%d"
x,&
y);
s=num(x,y);
s);
2-7.使给定的一个4*4的二维数组转置,即行列互换。
#include<
#definex4
inta[x][x];
voidmain()
voidzhuan(inta[x][x]);
intm,n;
printf("
pleaseinput%dnubbers\n"
x*x);
for(m=0;
m<
x;
m++)
for(n=0;
n++)
a[m][n]);
\n原数组:
for(m=0;
{for(n=0;
%5d"
a[m][n]);
}
zhuan(a);
\n转置后的数组:
{for(n=0;
voidzhuan(inta[x][x])
intc,d,e;
for(c=0;
c<
c++)
for(d=c+1;
d<
d++)
{e=a[c][d];
a[c][d]=a[d][c];
a[d][c]=e;
2-8.输出50个学生中成绩高于80分者的学号和成绩。
intmain()
inta[10][5],i,j;
请输入50个学生的成绩"
10;
for(j=0;
5;
a[i][j]);
if(a[i][j]>
80)
这个学生的学号是%d,这个学生的成绩是%d\n"
i*10+j+1,a[i][j]);
return0;
2-9.输出年份1990-2500中的所有闰年。
voidleap()
inty;
for(y=1990;
y<
=2500;
y++)
if((y%4==0&
y%100!
=0)||y%400==0)
%d"
y);
leap();
2-10.求1-1/2+1/3-1/4+…+1/99-1/100的值。
doublesum;
for(sum=0,i=1;
if(i%2==1)
sum+=1.0/i;
elseif(i%2==0)
sum-=1.0/i;
结果:
%lf"
return0;
2-11.输出三角形的三边长,试求三角形的面积。
intx,y,z,l;
doublearea;
inputxandyandz:
y,&
z);
l=(x+y+z)/2;
area=sqrt(l*(l-x)*(l-y)*(l-z));
%.2f\n"
area);
2-12.求ax2+bx+c=0方程的根,a,b,c由键盘输入(假设b2-4ac>
0)
floatx1,x2;
inputaandbandc:
x1=((-b)+sqrt(b*b-4*a*c))/(2*a);
x2=((-b)-sqrt(b*b-4*a*c))/(2*a);
if(b*b-4*a*c>
=0&
a!
=0)
%.2f,%.2f\n"
x1,x2);
flase\n"
2-13.输出成绩等级“优秀”、“良好”、“中等”。
“及格”,“不及格”。
其中90分(含90分)以上为优秀,80-89分为良好,70-79分为“中等”,60-69分为“及格”,60分以下为不及格。
main(){
scrnum;
请输入考试成绩"
scrnum);
if(scrnum>
=90){
优秀\n"
}else
=70
scrnum<
90){
良好\n"
=60
70){
及格\n"
if(scrnum<
60){
不及格!
2-14.给定一个正整数,求它的位数并分别输出每一位数字。
intn,i=0,k;
inputn:
n);
while(n!
k=n%10;
k);
n=n/10;
i++;
\n%d\n"
i);
2-15.输出所有水仙花数(水仙花数是指一个三位数,其各个数字立方和等于它本身)。
inta,b,c,i;
for(i=100;
=999;
a=i/100;
b=(i%100)/10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
2-16.求1!
+2!
+3!
+….30!
的值。
2-17.求Fibonacci数列前N个数。
Fibonacci数列的特点;
第一个和第二个数都为1,从第三个开始,每个数都等于其前两个数的和。
#defineN100
intn,i,f[N];
f[0]=f[1]=1;
f[i]=f[i-1]+f[i-2];
for(i=0;
f[i]);
2-18.把200以内不能被3整除的数输出。
200;
if(i%3!
2-19.班级有20名小学生,有语文,数学,英语的成绩,求班级各科的平均分。
i;
float
avg1,avg2,avg3,s1=0,s2=0,s3=0,a[20],b[20],c[20];
20;
%f%f%f"
a[i],&
b[i],&
c[i]);
s1+=a[i];
s2+=b[i];
s3+=c[i];
avg1=s1/20;
avg2=s2/20;
avg3=s3/20;
%f,%f,%f"
avg1,avg2,avg3);
2-20.输出100以内的所有素数,并且5个一行。
intn,k;
for(n=1;
100;
k++;
if(k%5==0)
printf("
2-21.输出1000到10000以内的可逆素数。
#include<
math.h>
intinverse(intn);
intisPrimer(intn);
main()
for(i=1000;
=10000;
i++)
if(isPrimer(i))
if(isPrimer(inverse(i)))
intinverse(intn)
intm=0,a;
for(;
n>
0;
n/=10)
a=n%10;
m=m*10+a;
return(m);
intisPrimer(intn)
inti,judge=1;
for(i=2;
=sqrt(n);
if(n%i==0)
judge=0;
break;
returnjudge;
2-22.两个数之差为2的素数,称谓孪生素数。
试输出5组孪生数。
i,j;
flag,n=0;
a[100];
for(i=2;
{
flag=1;
for(j=2;
if(i%j==0)
flag=0;
break;
if(flag==1)
a[n]=i;
n++;
for(j=i+1;
if(a[j]-a[i]==2)
%d
a[j]);
if(a[j+1]-a[j]==2)
a[j+1]);
i=3;
2-23.试输出1000到10000以内的对称数,并输出对称的个数。
2-24.输入10个学生5门课的成绩,计算每个学生的平均分,每门课的平均分兵找出各门课最高分数所对应的学生。
2-25.输入一行字符,统计其中数字,空格,小写字母,大写字母以及其他符号的个数。
chars;
inti=0,j=0,k=0,m=0,da=0,xiao=0;
pleaseinputthestring\n"
while((s=getchar())!
='
\n'
)/*循环从键盘读入字符直到一行结束(输入回车)*/
if((s<
z'
s>
a'
)||(s<
'
Z'
A'
))
if(s<
)da++;
)xiao++;
i++;
/*i存入字母数*/
elseif(s=='
'
)j++;
/*j存入空格数,注意s=='
里面是有一个空格的*/
elseif(s<
58&
47)k++;
/*k存入数字数*/
elsem++;
/*m存入其它符号数*/
字符:
%d大写字母:
%d小写字母:
%d\n空格:
%d\n数字:
%d\n其它:
i,da,xiao,j,k,m);
/*打印行中的字母,空格,数字,其它字符数*/
2-26.任意给定n值,按如下螺旋的方式输出方阵:
n=3时输出123
894
765
n=4时输出
1234
1213145
1116156
10987
Voidspi(intn)
inti=-1,j=0,k=n,a[100][100],r,s=1,t=1;
while(s<
=n*n)
for(r=0;
r<
k;
r++)
i+=t;
a[j][i]=s++;
for(r=k;
2*k-1;
j+=t;
k--;
t=-t;
for(j=0;
%3d"
a[i][j]);
inputanumber"
spi(n);
2-27.输出魔方阵(魔方阵是它的每一行,每一列和对角线之和均相等的方阵)如三阶魔方阵为:
816
357
492
inta[50][50],n,x,y,i,j,k;
输入魔方阵的阶数n:
n"
if(n%2==0)n++;
for(i=1;
=n;
for(j=1;
a[i][j]=0;
i=1;
j=(n+1)/2;
a[i][j]=1;
for(k=2;
k<
=n*n;
k++)
{i--;
j++;
if((i<
1)&
(j>
n)){i+=2;
j--;
if(i<
1)i=n;
if(j>
n)j=1;
if(a[i][j]!
=0){i+=2;
a[i][j]=k;
{printf("
%3d"
if(j==n)printf("
getchar();
getchar();
2-28编程打印形如下规律的n*n方阵例如下图:
使左对角线和右对角线上的元素为0,它们上方的元素为1,左方的元素为2,下方元素为3,右方元素为4,下图是一个符合条件的阶矩阵。
0
1
2
4
4
3
第三章:
累加法
3-1编程求1-2+3-4+5-6+7-……+99-100。
i,s;
for(i=1,s=0;
if(i%2!
s+=i;
else
s-=i;
getch();
3-2.1-1/2+1/3-1/4+…-1/100
voidp2()
floats=0;
intp=-1;
for(inti=1;
101;
i++){
p*=(-1);
s+=p*1.0/i;
1-1/2+1/3-1/4+…-1/100的结果是:
%f\n"
p2();
3-3求100以内所有素数的和
intfun(intm)
for(inti=2;
m;
return1;