算法设计方法与优化滕国文部分课后习题答案.doc

上传人:xin****828 文档编号:6531755 上传时间:2020-02-28 格式:DOC 页数:73 大小:204KB
返回 下载 相关 举报
算法设计方法与优化滕国文部分课后习题答案.doc_第1页
第1页 / 共73页
算法设计方法与优化滕国文部分课后习题答案.doc_第2页
第2页 / 共73页
算法设计方法与优化滕国文部分课后习题答案.doc_第3页
第3页 / 共73页
点击查看更多>>
资源描述
第二章:求值法2-1有三个数a,b,c,要求按从大到小的顺序把他们输出。 #include stdio.hvoid fun(int a,int b,int c) int t;if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(bc)t=b;b=c;c=t;printf(%d,%d,%d,c,b,a);void main()int a,b,c;printf(input number:);scanf(%d%d%d,&a,&b,&c);fun(a,b,c);printf(n);2-2给定n个数,求这些数中的最大值。#includevoidmain()inti,j,temp,n;inta1000;scanf(%d,n);for(i=0;i9;i+)scanf(%d,ai);for(j=0;jn;j+)for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp;printf(%dn,an);2-3求1+2+3+100的和。#include stdio.hvoid main()int num,sum=0;for(num=1;num=100;num+)sum+=num;printf(%dn,sum);2-4判断一个数n能否同时被3和5整数。#include stdio.hint fun(int n)if(n%3=0&n%5=0)return n;elsereturn 0;2-5将100至200之间的素数输出。#includestdio.h#include math.hint isp(int m)int i;for(i=2;i=sqrt(m);i+)if(m%i=0)return 0;return 1;void main()int n;for(n=100;n=200;n+)if(isp(n)printf(%dt,n);2-6求两个数m和n的最大公约数。#includestdio.hint num(int m,int n)int r,t;if(mn)t=m;m=n;n=t;r=m%n;while(r)m=n;n=r;r=m%n;return n;void main()int x,y,s;printf(input x and y:);scanf(%d%d,&x,&y);s=num(x,y);printf(%dn,s);2-7使给定的一个4*4的二维数组转置,即行列互换。#include #define x 4 int axx; void main() void zhuan(int axx); int m,n; printf(please input %d nubbersn,x*x); for(m=0;mx;m+) for(n=0;nx;n+) scanf(%d,&amn); printf(n原数组:n); for(m=0;mx;m+) for(n=0;nx;n+) printf(%5d,amn); printf(n); zhuan(a); printf(n转置后的数组:n); for(m=0;mx;m+) for(n=0;nx;n+) printf(%5d,amn);printf(n); void zhuan(int axx) int c,d,e; for(c=0;cx;c+) for(d=c+1;dx;d+) e=acd ; acd=adc; adc=e; 2-8输出50个学生中成绩高于80分者的学号和成绩。#includeint main()int a105,i,j;printf(请输入50个学生的成绩);for(i=0;i10;i+)for(j=0;j5;j+)scanf(%d,&aij);for(i=0;i10;i+)for(j=0;j80)printf(这个学生的学号是%d,这个学生的成绩是%dn,i*10+j+1,aij);return 0;2-9输出年份1990-2500中的所有闰年。#includestdio.hvoid leap()int y;for(y=1990;y=2500;y+)if(y%4=0&y%100!=0)|y%400=0)printf(%d ,y);printf(n);void main()leap();2-10.求1-1/2+1/3-1/4+1/99-1/100的值。#includeint main() double sum; int i; for(sum=0,i=1;i0)#includestdio.h#include math.hvoid main()int a,b,c;float x1,x2;printf(input a and b and c:);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,%.2fn,x1,x2);elseprintf(flasen);2-13.输出成绩等级“优秀”、“良好”、“中等”。“及格”,“不及格”。其中90分(含90分)以上为优秀,80-89分为良好,70-79分为“中等”,60-69分为“及格”,60分以下为不及格。#includevoidmain()intscrnum;printf(请输入考试成绩);scanf(%d,&scrnum);if(scrnum=90)printf(优秀n);elseif(scrnum=70&scrnum=60&scrnum70)printf(及格n);elseif(scrnum60)printf(不及格!n);2-14. 给定一个正整数,求它的位数并分别输出每一位数字。#includestdio.hvoid main()int n,i=0,k;printf(input n:);scanf(%d,&n);while(n!=0)k=n%10;printf(%d ,k);n=n/10;i+;printf(n%dn,i);2-15. 输出所有水仙花数(水仙花数是指一个三位数,其各个数字立方和等于它本身)。#includestdio.hvoid main()int a,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(%dt,i);printf(n);2-16. 求1!+2!+3!+.30!的值。2-17. 求Fibonacci数列前N个数。Fibonacci数列的特点;第一个和第二个数都为1,从第三个开始,每个数都等于其前两个数的和。#includestdio.h#define N 100void main()int n,i,fN;f0=f1=1;printf(input n:);scanf(%d,&n);for(i=2;in;i+)fi=fi-1+fi-2;for(i=0;in;i+)printf(%dt,fi);printf(n);2-18. 把200以内不能被3整除的数输出。#includestdio.hvoid main()int i;for(i=0;i200;i+)if(i%3!=0)printf(%dt,i);printf(n);2-19. 班级有20名小学生,有语文,数学,英语的成绩,求班级各科的平均分。#includestdio.hvoidmain()inti;floatavg1,avg2,avg3,s1=0,s2=0,s3=0,a20,b20,c20;for(i=0;i20;i+)scanf(%f%f%f,&ai,&bi,&ci);for(i=0;i20;i+)s1+=ai;s2+=bi;s3+=ci;avg1=s1/20;avg2=s2/20;avg3=s3/20;printf(%f,%f,%f,avg1,avg2,avg3);2-20. 输出100以内的所有素数,并且5个一行。#includestdio.h#include math.hint isp(int m)int i;for(i=2;i=sqrt(m);i+)if(m%i=0)return 0;return 1;void main()int n,k;for(n=1;n100;n+)if(isp(n)printf(%dt,n);k+;if(k%5=0)printf(n);printf(n);2-21. 输出1000到10000以内的可逆素数。#include #include int inverse(int n); int isPrimer(int n); main() int i; for (i=1000;i0;n/=10) a=n%10; m=m*10+a; return(m); int isPrimer(int n) int i,judge=1; for (i=2;i=sqrt(n);i+) if (n%i=0) judge=0; break; return judge; 2-22. 两个数之差为2的素数,称谓孪生素数。试输出5组孪生数。#includestdio.hmain()inti,j;intflag,n=0;inta100;for(i=2;i=100;i+)flag=1;for(j=2;ji;j+)if(i%j=0)flag=0;break;if(flag=1)an=i;n+;for(i=0;in;i+)for(j=i+1;jn;j+)if(aj-ai=2)printf(%d,ai);printf(%d,aj);if(aj+1-aj=2)printf(%d,aj+1);i=3;printf(n);2-23. 试输出1000到10000以内的对称数,并输出对称的个数。2-24.输入10个学生5门课的成绩,计算每个学生的平均分,每门课的平均分兵找出各门课最高分数所对应的学生。2-25. 输入一行字符,统计其中数字,空格,小写字母,大写字母以及其他符号的个数。#include stdio.h void main() char s; int i=0,j=0,k=0,m=0,da=0,xiao=0; printf(please input the stringn); while(s=getchar()!=n) /*循环从键盘读入字符直到一行结束(输入回车)*/ if(s=a)|(sA) if(s=A)da+; if(s=a)xiao+; i+; /*i存入字母数*/ else if(s= ) j+; /*j存入空格数,注意s= 里面是有一个空格的*/ else if(s47)k+; /*k存入数字数*/ else m+; /*m存入其它符号数*/ printf(字符:%d 大写字母:%d 小写字母:%dn空格:%dn数字:%dn其它:%dn,i,da,xiao,j,k,m); /*打印行中的字母,空格,数字,其它字符数*/ 2-26. 任意给定n值,按如下螺旋的方式输出方阵:n=3时输出123894765n=4时输出12341213145111615610987#include Void spi(int n)int i=-1,j=0,k=n,a100100,r,s=1,t=1;while(s=n*n)for(r=0;rk;r+)i+=t;aji=s+;for(r=k;r2*k-1;r+)j+=t;aji=s+;k-;t=-t;for(i=0;in;i+)for(j=0;jn;j+)printf(%3d,aij);printf(n);void main()int n;printf(input a number);scanf(%d,&n);spi(n);2-27. 输出魔方阵(魔方阵是它的每一行,每一列和对角线之和均相等的方阵)如三阶魔方阵为:816357492#includestdio.hvoid main() int a5050,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+) aij=0; i=1;j=(n+1)/2;aij=1; for (k=2;k=n*n;k+) i-;j+; if (in) i+=2;j-; if(in) j=1; if (aij!=0) i+=2;j-; aij=k; for (i=1;i=n;i+) for (j=1;j=n;j+) printf(%3d ,aij); if(j=n) printf(n); getchar();getchar();2-28编程打印形如下规律的n*n方阵例如下图:使左对角线和右对角线上的元素为0,它们上方的元素为1,左方的元素为2,下方元素为3,右方元素为4,下图是一个符合条件的阶矩阵。0111020104220442030403330第三章:累加法3-1编程求1-2+3-4+5-6+7-+99-100。#includemain()inti,s;for(i=1,s=0;i=100;i+)if(i%2!=0)s+=i;elses-=i;printf(%dn,s);getch();3-21-1/2+1/3-1/4+-1/100#include void p2()float s=0;int p=-1;for(int i=1;i101;i+)p*=(-1);s+=p*1.0/i;printf(1-1/2+1/3-1/4+-1/100的结果是:%fn,s);void main()p2();3-3求100以内所有素数的和#includeint fun(int m)for(int i=2;im;i+)if(m%i=0)return 0;return 1;void main()int i;for(i=2;i=100;i+)if(fun(i)printf(%dn,i);3-10输入一个数n,求1+2+3+4+5+4+3+2+1的值#includeint fun(int n)int s=0;for(int i=1;i=n;i+)s+=i;return s;void main()int n;scanf(%d,&n);printf(%d,2*fun(n)-n);3-15求1000以内所有的完全数的和(完全数是指一个数除其本身外的因子之和等于该数。例如,28=1+2+4+7+14,因此28为完全数)。#includeint fun(int n)int s=0;for(int i=1;i=n-1;i+)if(n%i=0) s=s+i;if(s=n)printf(%d ,n); return s;elsereturn 0;void main()int sum=0;for(int i=1;i=1000;i+)sum+=fun(i);printf(n);printf(%dn,sum);3-19. 计算S=1+2+3+n+(n+1)+(n+2)+ 在累加过程过程中,求当S的值首次大于3000时的n的n值是多少?#includevoidmain()intn,s;n=1,s=0;while(s3000)s+=n;n+;/这句程序是怎样实现功能的?n-;/这句程序放在这又有什么用?printf(n=%d,s=%dn,n,s);3-24输入一行字符,统计其中的英文字母个数。提示:输入到字符n时停止输入。#includevoid main()char a100;int count=0,i;for(i=0;i+) ai=getchar();if(ai=n)break;if(ai=a&ai=A&ai=Z)count+; printf(%d,count);3-30求e的值,根据输入的n值,求前n 项的和。e=1+1/1!+1/2!+1/3!+1/n!。#includefloat fun(int n)int p=1;for(int i=1;i=n;i+)p*=i;return p;void main()int n;float sum=1;scanf(%d,&n);for(int i=1;i=n;i+)sum+=1/fun(i); printf(%f,sum);第四章:累乘法4-6已知s=1!*2!*3!*n!.#include void main() int i=1,t=1,s=1; while(s2000000) t*=i;s*=t;i+; printf(n=%d s=%dn,i-1,s/t);4-13求这样一个三位数,该三位数等于其每位数字阶乘之和#includefloat fun(int n)int p=1;for(int i=1;i=n;i+)p*=i;return p;void main()int a1,a2,a3;for(int a=100;a1000;a+)a1=a/100; a2=a%100/10; a3=a%10; if(a=fun(a1)+fun(a2)+fun(a3) printf(%d ,a);4-15老师给十个小孩分发糖果,第一个和第二个小孩各分一块糖,之后为奇数的小孩可得到前个奇数小孩的2倍糖果,为偶数的小孩可得到前个偶数小孩的3倍糖果。问第9个、第10个小孩各获得多少糖果。 #include void main() int i=1,j=1; for(int k=3;k11;k+) if(k%2=0) j*=3; else i*=2; printf(%d %dn,i,j);4-17自守数是指一个数的平方的尾数等于自身的自然数。例如:252=625,762=5776,93762=87909376.请求出200000以内的自守数。#include void main() long i,i2,m,k=1; for (i=0;i0) k*=10; i2 = i*i; m = i2%k; if (m=i) printf (%ld*%ld=%ldn,i,i,i2);4-18假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的5年中每年的年底取出1000元,到第五年刚好取完,请算出他存钱时应存多少。#include void main()float a=0;for(int i=1;i=5;i+)a=(a+1000)/(1+(0.0063*12); printf(%f n,a);4-19.找出100-999之间(含100和999)所有整数中各个位上数字之积为x(x为一正整数)的整数,然后输出符合条件的整数个数作为函数值返回。例如,当x为10时,100-999之间各个位上数字之积为10的整数有215,512共2个。#include int s(int n) int a,b,c,j=0; for(int i=100;i1000;i+) a=i/100; b=(i%100)/10; c=i%10; if(a*b*c=n) j+; printf(%d ,i); return j;void main() int n; scanf(%d,&n); printf(一共%d个n,s(n);4-20.编写fun函数,计算下式前n项的和作为函数返回值。 S=(1*3)/22+(3*5)/42+(5*7)/62+(2n-1)*(2n+2)/(2n)2#include double fun(int n) double S=0; for(int i=1;i=n;i+) float t1,t2; t1=(2*i-1)*(2*i+1); t2=4*i*i; S+=t1/t2; return S;void main() int n; scanf(%d,&n); printf(%fn,fun(n);4-23.计算并输出以下列数的前n项之积Sn ,直到Sn-1大于q为止,q的值通过形参传入(q为输入值)。#include float sum(int q) int n=1; float s=2/1; while(sq) s+=(n+1)/n; n+; return s;void main() int q; scanf(%d,&q); printf(Sn=%fn,sum(q);4-24.求s=aaaa-aaa-aa-a(此处aaaa表示n和a,a和n的值在1-9之间),例如:a=3,n=6,则以上表达式为:s=333333-33333-3333-333-33-3,其值为196298.#include int fun(int a,int n) int s=a,sum=a;for(int i=0;in-2;i+)a*=10;/得到 30 300 3000 s+=a;/得到 33 333 3333; sum+=s; / 3+(3+30)+(3+30+300) a*=10;s+=a;return s-sum;void main() int a,n; scanf(%d%d,&a,&n); printf(%dn,fun(a,n);4-25将s所指字符串中ASCII值为奇数的字符累乘,并将其乘积返回给主函数。#include #include void main()char a100; gets(a); int sum=1; for(int i=0;istrlen(a);i+)if(ai%2!=0)sum = sum*ai;printf(%dn,sum);第五章:递推法5-1. 已知数列 an ,通项an=n*an-1,a1=1,求第n项的值#include void main() int t,i,t1=1,n; printf(请输入n:); scanf(%d,&n); for(i=1;i=n;i+) t=i*t1; t1=t; printf(%dn,t);5-2#include void fun(int n)int i,c,a=1,b=1,s;s=a+b; for(i=3;i=n;i+)c=a+b;s=s+c;a=b;b=c;printf(%d,s);void main()int n;printf(input n:);scanf(%d,&n);fun(n);5-4.#include void main()int s=0;for(int i=1;i100;i+=2)int t=1;for(int j=i;j=i+2;j+) t*=j; s+=t;printf(结果为%dn,s);5-5.#include int fun()int i,a=10;for(i=5;i1;i-)a=a+2;return a;int main()printf(%dn,fun();5-7有一组数规律如下:0,5,5,10,15,25,40,求出该数列第n项的数值。#includevoid fun(int n)int a1=0,a2=5,a3;a3=a1+a2;for(int i=0;in-3;i+) a1=a2; a2=a3; a3=a1+a2;printf(%dn,a3);void main()int n;scanf(%d,&n);fun(n);5-8.#include void main()int a44=2,6,2,1,8,4,1,5,6,8;int s=2;for(int i=1;i4;i+) int min=ai0; for(int j=0;j=i;j+) /printf(%d,aij); if(aijmin) min=aij; /printf(n); /printf(%dn,min);/选择路径 s+=min;printf(最终得分:%dn,s);5-9一个富翁给他的儿子的四年大学生活存一笔钱,儿子每月只能取3000元作为下个月的生活费,采用的是整存零取的方式。已知年利率为1.71%,请问富翁一次性需要存入多少钱#includedouble fun()double a=0;int i;for(i=1;i=48;i+)a=(a+3000)/(1+(0.0171/12); printf(%.3fn,a);return a;void main()fun();5-10.#include void tao()int i,a;a=2;for(i=9;i=1;i-)a=(a+1)*2+2;printf(sum=%dn,a);void main()tao();5-11.#include int fun(int n) int s20,sum=0; s0=3,s1=7; for(int i=2;i=n;i+) si=2*si-1+si-2; /printf(%dn,si); return sn-1;void main() int N; scanf(%d,&N); printf(%dn,fun(N);5-12.#includevoid main()int i,p,n,total; scanf(%d %d,&n,&p); total=2*p; for(i=p+1;i=0,y=0,输入一个数n,求出元素从小到大排列的双幂数列的第n项值,以及前n项和。#include int main()int n,i=2,k=2,m=3,a100=0,1,sum=0;scanf(%d,&n);while(i=n)/k=2;m=3;if(km)ai+=k;k*=2;elseai+=m; m*=3; for(i=1;i=n;i+)printf(%dn,ai);sum+=ai;printf(sum=%dn,sum); return 0;5-15.#include void main() int s20,i; s1=1,s2=2; int n; scanf(%d,&n); for(i=3;i=n;i+) si=si-1+si-2+1; printf(%dn,sn);5-21一张圆薄饼,切100刀,最多能切成多少块?#includevoid main()int n=100,a;a=1+n*(n+1)/2; printf(%dn,a);第六章:递归法6-1.#include float Avg(int a,int n); float Avg(int a,int n) if(n=0) return a0; else return Avg(a,n-1)+an; void main() int array100; int n;scanf(%d,&n);for(int i=0;in;i+) scanf(%d,&arrayi); /要这样输入吧 /Avg(array,n); printf(这%d个数的平均值是:%fn,n,Avg(array,n-1)/n); 6-2.#include void main()int n;long fun(int x);scanf(%d,&n);printf(%ldn,fun(n);long fun(int x) if (x=1) return 1; return x+fun(x-1);6-3.#include int Func(int n) if(n 2)return 1; else return n*Func(n-1); int main() int n; printf(input n:n); scanf(%d,&n);printf(n! = %dn,Func(n);return 0; 6-4.#includevoid permute(int);#define N 7int aN;int n=0;void main() int i; for (i=0;iN;i+) ai=i+1; permute(N); printf(total is:%dn,n);void permute(int k) int i,j,temp; if (k=1) for (i=0;iN;i+) printf(%d ,ai); printf(.t); n+; if (n%4=0) printf(n); else permute(k-1); for (j=N-k+1;jN;j+) temp=aN-k; aN-k=aj; aj=temp; permute(k-1); temp=aN-k; aN-k=aj; aj=temp; 6-5.#include int s100;void Comb(int step, int n, int k) int i; if(k = 0) | (n - step + 1) = k) for(i = step; i = n; i+) si = (k != 0); for(i = 1; i = n; i+) if(si) printf(%-3d, i); printf(n); return; sstep = 1, Comb(step + 1, n, k - 1); sstep = 0, Comb(step + 1, n, k);void main( ) int n, m; scanf(%d%d, &n, &m); Comb(1, n, m);6-6.求两个数的最小公倍数,两个数由键盘输入。#include int fun(int a,int m,int n) if (a%n) return fun(a+m,m,n); else return a;int main() int m,n,a; scanf(%d%d, &n, &m); a=n; printf(%dn, fun(a, n, m); return 0;6-7.#includevoid main() int x,r,s=0;scanf(%d,&x);while(x0) r=x%10; s=s+r; x=x/10; printf(%dn,s);6-8.#include main() int number,b30; int i=0,n; printf(Input a number:); scanf(%d,&number); while(number!=0) bi=number%2; number=number/2;i+; n=i-1; for(i=n;i=0;i-) printf(%d,bi); printf(n);6-12#includeint func(int n,int k,int min)int i, count;if(k=2)if(i=(n+1)/2-min-1)0)return i;elsereturn 0;elsecount=0;for(i=min+1;in/2.0;i+)count+=func(n-i,k-1,i);return(count);int main()int n,k,i,count;count=0;printf(Please Inputb N:);scanf(%d,&n);if(n1)printf(Invalid Input!n);return(-1);printf(Please Input K:);scanf(%d,&k);if(k1)printf(Invalid Input!n);return(-2);count=func(n,k,0);printf(count:%dn,count);return(0);6-14写出折半查找的递归算法
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!