算法设计方法与优化滕国文部分课后习题答案.docx
- 文档编号:8730390
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:100
- 大小:43.33KB
算法设计方法与优化滕国文部分课后习题答案.docx
《算法设计方法与优化滕国文部分课后习题答案.docx》由会员分享,可在线阅读,更多相关《算法设计方法与优化滕国文部分课后习题答案.docx(100页珍藏版)》请在冰豆网上搜索。
算法设计方法与优化滕国文部分课后习题答案
第二章:
求值法
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;m for(n=0;n scanf("%d",&a[m][n]); printf("\n原数组: \n"); for(m=0;m {for(n=0;n printf("%5d",a[m][n]); printf("\n");} zhuan(a); printf("\n转置后的数组: \n"); for(m=0;m {for(n=0;n printf("%5d",a[m][n]);printf("\n");} } voidzhuan(inta[x][x]) { intc,d,e; for(c=0;c for(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;i f[i]=f[i-1]+f[i-2]; for(i=0;i printf("%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;j printf("%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;i if(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++;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 方法 优化 国文 部分 课后 习题 答案