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