您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页算法设计与分析习题辅导

算法设计与分析习题辅导

来源:纷纭教育
1、编写程序实现求两个整数a、b(a>b)的最大公约数(a,b)的欧几里得算法,例如10920,21420。

#include\"stdio.h\" void main() {

long a,b,c,r;

printf(\"请输入整数a,b:\");

scanf(\"%ld,%ld\输入整数a,b printf(\"(%ld,%ld)\ if(a{c=a;a=b;b=c;} //交换a,b,确保a>b r=a%b;

while(r!=0) {

a=b;b=r; //实施“辗转相除” r=a%b;

}

printf(\"=%ld\\n\输出求解结果 }

2、试求含有数字7且不能被7整除的5位数的个数,并求这些整数的和。

#include void main() {

int c,j,m,n,f[10];

long d,k,g1,g2,s1,s2,t;

printf(\"请输入一位整数m,n:\"); scanf(\"%d,%d\ t=1;

for(k=1;k<=n-1;k++)

t=t*10; //求最小的n位整数t g1=0;s1=0; g2=0;s2=0;

for(k=t;k<=10*t-1;k++) //枚举每一个n位数 { d=k;

for(j=0;j<=9;j++)f[j]=0; for(j=1;j<=n;j++) {

c=d%10;f[c]+=1; //统计n位整数k中各数字的个数 d=d/10; }

if(f[m]>0&&k%m>0) //k含数字m且不能被m整除 { g1++;s1+=k;}

if(f[m]==2&&k%m>0) //k恰含2个数字m且不能m整除 {g2++;s2+=k;} }

printf(\"含数字%d且不能被%d整除的%d位整数的个数g1=%ld\\n\

printf(\"这些整数的和为s1=%ld\\n\

printf(\"恰含2个数字%d且不能被%d整除的%d位整数个数g2=%ld\\n\

printf(\"这些整数的和为s2=%ld\\n\}

3、韩信在点兵的时候,为了知道有多少个兵,同时又能保住军事机密,便让士兵排队报数。

按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按1至7报数,记下最末一个报的数为4; 最后按1至11报数,最末一个士兵报的数为10。 编写程序计算韩信至少有多少兵?

#include void main() {

int n;

for(n=1;;n++)

if(n%5==1&&n%6==5&&n%7==4&&n%11==10) { printf(\"韩信至少有兵:%d\\n\ break; } }

4、核反应堆中有α和β两种粒子,每秒钟内一个α粒子可以裂变为3个β粒子,而一个β粒子可以裂变为1个α粒子和2个β粒子。若在t=0时刻的反应堆中只有一个α粒子,求在t秒时反应堆裂变产生的α粒子和β粒子数。

#include void main() {

int t,a=1,b=0,h,i; scanf(\"%d\

}

for(i=1;i<=h;i++){ t=a; a=b;

b=t*3+b*2; }

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

5、应用递归设计输出杨辉三角。

#include void main() {

int n,i,j,k,a[20][20]; printf(\"请输入行数 n:\"); scanf(\"%d\ for(i=1;i<=n;i++)

{a[i][1]=1;a[i][i]=1;} //确定初始条件 for(i=3;i<=n;i++)

for(j=2;j<=i-1;j++) //递推实施 a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=1;i<=n;i++) //控制输出n行 {for(k=1;k<=40-3*i;k++) printf(\" \");

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

printf(\"%6d\ printf(\"\\n\"); } }

6、有一猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。第2天早上又将剩下的桃子吃掉一半,又多吃了1个。以后每天早上都吃了前一天剩下的一半后又多吃1个。到第10天早上想再吃时,见只剩下1个桃子了。编写程序计算第1天共摘了多少个桃子。

#include #include int main() {

int i,j; j=1;

for(i=1;i<10;i++) {

j=2*(j+1); }

printf(\"第一天摘桃子的个数为%d\\n\

return 0; }

7、阶乘n!定义: n!=1(n=1);n!=n*(n-1)! (n>1),设计求n!的递归函数,调用该函数求

#include double fun (double n) {

double sum=1;

if(n==1)return 1; sum=n*fun(n-1); return sum; }

void main () {

int n,i; double s=1;

printf (\"Enter n:\"); scanf (\"%d\ for (i=1;i<=n;i++) s=s+1.0/fun(i);

printf (\"s= %f\\n\}

8、把1,2,...,9•这9个数字填入下式的9个方格中,数字不得重复,且要求1不得填在各分数的分母,且式中各分数的分子分母没有大于

1的公因数,使下面的分数等式成立。这一填数分数等式共有多少个解?

#include void main() {

int g,i,k,s,t,u,a[10]; long m1,m2,m3; i=1;a[1]=1;s=0; while (1) {

g=1;

for (k=i-1;k>=1;k--)

if (a[i]==a[k] ) { }

if (i==9 && g==1 && a[1]m1=a[2]*10+a[3]; m2=a[5]*10+a[6]; m3=a[8]*10+a[9];

if (a[4]*a[7]*m1+a[1]*a[7]*m2==a[1]*a[4]*m3 && a[1]!=1 && { }

s++;printf (\"(%2d)\

printf (\"%ld/%d+%ld/\printf (\"%d=%ld/%d\printf (\" \");

if (s%2==0) printf (\"\\n\"); g=0;break;

a[4]!=1 && a[7]!=1)

}

}

}

if (i<9 && g==1) { }

while (a[i]==9 && i>1) i--; if (a[i]==9 && i==1) break; else a[i]++;

i++;a[i]=1;continue;

printf (\"共以上%d个解。 \\n\

9、编写程序实现整数762191754639820463中删除6个数字后,剩下的数字按原次序组成一个新的正整数,所得最大整数为多大?

//贪心删数字大最大 #include \"stdio.h\" void main () {

int i ,k , t, m, n, x, a[10000]; char b[100000]; printf (\"请输入整数:\"); scanf (\"%s\

for (n=0,i=0;b[i]!='\\0';i++) {n++;a[i]=b[i]-48;}

printf (\"删除数字个数:\");scanf (\"%d\

printf (\"以上%d位整数中删除%d个数字分别为:=0;m=0;x=0; i=t+1;

while (xif(t>=0&&a[t]{printf(\"%d,\a[t]=-1;

while(t>=0&&a[t]==-1)

}

}

t--;x=x+1;

else t=i++;

printf(\"\\n删除后所得最大数:\"); for(i=0,x=0;xif(a[i]!=-1)

{printf(\"%d\\n\}

10、给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。有4个权值为{2,7,5,4}叶子节点,编写程序试构造一颗哈夫曼树。

11、已知6种物品和一个可容纳60重量的背包,物品i的重量为wi,产生的效益为pi。在装包时物品i

可以装入,也可以不装,但不可拆开装。即物品i可产生的效益为xi*pi,这里xi属于{0,1},c,wi,pi属于N+。设计如何装包,所得装包总效益最大。相关参数见下表 W1 W2 W3 W4 W5 W6 #include \"stdio.h\" #define N 50 void main () {

int i,j,c,cw,n,sw,sp,p[N],w[N],m[N][10*N]; printf (\"input n:\"); scanf (\"%d\printf (\"input c:\"); scanf (\"%d\for (i=1;i<=n;i++)

15 17 20 12 9 14 P1 P2 P3 P4 P5 P6 32 37 46 26 21 30 }

{ }

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

if (j>=w[n])

m[n][j]=p[n]; m[n][j]=0; for (j=0;j<=c;j++)

if (j>=w[i] && m[i+1][j]m[i][j]=m[i+1][j-w[i]]+p[i]; m[i][j]=m[i+1][j]; else cw=c;

printf (\"c=%d\\n\printf (\"背包所装物品:\\n\"); printf (\"i w(i) p(i)\\n\"); for (sp=0,sw=0,i=1;i<=n-1;i++)

if (m[i][cw] > m[i+1][cw]) { }

if (m[1][c]-sp==p[n]) { }

printf (\"w=%d,pmax=%d\\n\

sw+=w[i];sp+=p[i];

printf (\"%d%3d %4d\\n\cw-=w[i];sw+=w[i];sp+=p[i]; printf (\"%d%3d %4d\\n\

else

for (i=n-1;i>=1;i--)

printf (\"input w%d,p%d:\scanf (\"%d,%d\

12、(贪心算法)已知5种物品和一个可容纳90重量的背包,物品i的重量为wi,产生的效益为pi。在装包时物品i可拆开装。即可只装每种物品的一部分,物品i的一部分可产生的效益为xipi,这里xi属于{0,1},pi大于0。设计如何装包,所得装包总效益最大。相关参数见下表 W1 W2 W3 W4 P1 P2 P3 P4 32.5 25.3 37.4 41.3 28.2 56.2 40.5 70.8 78.4 40.2 W5 P5 //可拆背包程序实现 #include #define N 100 void main() { float p[N],w[N],x[N],c,cw,s,h; int i,j,n; printf(\"input n:\"); scanf(\"%d\ printf(\"input c:\"); scanf(\"%f\ for(i=1;i<=n;i++) { printf(\"input w%d,p%d:\ scanf(\"%f,%f\ } for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++) if(p[i]/w[i]cw)break; x[i]=1.0; cw=cw-w[i]; s=s+p[i]; } x[i]=(float)(cw/w[i]);

s=s+p[i]*x[i]; printf(\"装包:\"); for(i=1;i<=n;i++) if(x[i]<1)break; else printf(\"\\n装入重量为%5.1f效益为%5.1f的物品.\ if(x[i]>0&&x[i]<1) printf(\"\\n装入重量为%5.1f效益为%5.1f的物品百分之%5.1f.\ }

printf(\"\\n所得最大效益为:%7.1f\

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务