算法设计与分析习题辅导.docx

上传人:b****3 文档编号:2844849 上传时间:2022-11-15 格式:DOCX 页数:11 大小:23.01KB
下载 相关 举报
算法设计与分析习题辅导.docx_第1页
第1页 / 共11页
算法设计与分析习题辅导.docx_第2页
第2页 / 共11页
算法设计与分析习题辅导.docx_第3页
第3页 / 共11页
算法设计与分析习题辅导.docx_第4页
第4页 / 共11页
算法设计与分析习题辅导.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

算法设计与分析习题辅导.docx

《算法设计与分析习题辅导.docx》由会员分享,可在线阅读,更多相关《算法设计与分析习题辅导.docx(11页珍藏版)》请在冰豆网上搜索。

算法设计与分析习题辅导.docx

算法设计与分析习题辅导

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

#include"stdio.h"

voidmain()

{

longa,b,c,r;

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

");

scanf("%ld,%ld",&a,&b);//输入整数a,b

printf("(%ld,%ld)",a,b);

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",b);//输出求解结果

}

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

#include

voidmain()

{

intc,j,m,n,f[10];

longd,k,g1,g2,s1,s2,t;

printf("请输入一位整数m,n:

");

scanf("%d,%d",&m,&n);

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",m,m,n,g1);

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

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

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

}

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

按从1至5报数,记下最末一个士兵报的数为1;

再按从1至6报数,记下最末一个士兵报的数为5;

再按1至7报数,记下最末一个报的数为4;

最后按1至11报数,最末一个士兵报的数为10。

编写程序计算韩信至少有多少兵?

#include

voidmain()

{

intn;

for(n=1;;n++)

if(n%5==1&&n%6==5&&n%7==4&&n%11==10)

{printf("韩信至少有兵:

%d\n",n);

break;

}

}

4、核反应堆中有α和β两种粒子,每秒钟内一个α粒子可以裂变为3个β粒子,而一个β粒子可以裂变为1个α粒子和2个β粒子。

若在t=0时刻的反应堆中只有一个α粒子,求在t秒时反应堆裂变产生的α粒子和β粒子数。

#include

voidmain()

{

intt,a=1,b=0,h,i;

scanf("%d",&h);

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

t=a;

a=b;

b=t*3+b*2;

}

printf("%d,%d\n",a,b);

}

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

 

#include

voidmain()

{

intn,i,j,k,a[20][20];

printf("请输入行数n:

");

scanf("%d",&n);

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",a[i][j]);

printf("\n");

}

}

6、有一猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。

第2天早上又将剩下的桃子吃掉一半,又多吃了1个。

以后每天早上都吃了前一天剩下的一半后又多吃1个。

到第10天早上想再吃时,见只剩下1个桃子了。

编写程序计算第1天共摘了多少个桃子。

#include

#include

intmain()

{

inti,j;

j=1;

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

{

j=2*(j+1);

}

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

return0;

}

7、阶乘n!

定义:

n!

=1(n=1);n!

=n*(n-1)!

(n>1),设计求n!

的递归函数,调用该函数求

#include

doublefun(doublen)

{

doublesum=1;

if(n==1)return1;

sum=n*fun(n-1);

returnsum;

}

voidmain()

{

intn,i;

doubles=1;

printf("Entern:

");

scanf("%d",&n);

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

s=s+1.0/fun(i);

printf("s=%f\n",s);

}

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

这一填数分数等式共有多少个解?

 

#include

voidmain()

{

intg,i,k,s,t,u,a[10];

longm1,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])

{

g=0;break;

}

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&&a[4]!

=1&&a[7]!

=1)

{

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

printf("%ld/%d+%ld/",m1,a[1],m2);

printf("%d=%ld/%d",a[4],m3,a[7]);

printf("");

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

}

}

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

{

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

}

while(a[i]==9&&i>1)i--;

if(a[i]==9&&i==1)break;

elsea[i]++;

}

printf("共以上%d个解。

\n",s);

}

 

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

//贪心删数字大最大

#include"stdio.h"

voidmain()

{

inti,k,t,m,n,x,a[10000];

charb[100000];

printf("请输入整数:

");

scanf("%s",b);

for(n=0,i=0;b[i]!

='\0';i++)

{n++;a[i]=b[i]-48;}

printf("删除数字个数:

");scanf("%d",&k);

printf("以上%d位整数中删除%d个数字分别为:

",n,k);

t=0;m=0;x=0;

i=t+1;

while(x

{if(t>=0&&a[t]

{printf("%d,",a[t]);

a[t]=-1;

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

t--;x=x+1;

}

elset=i++;

}

printf("\n删除后所得最大数:

");

for(i=0,x=0;x

if(a[i]!

=-1)

{printf("%d\n",a[i]);x++;}

}

10、给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffmantree)。

有4个权值为{2,7,5,4}叶子节点,编写程序试构造一颗哈夫曼树。

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

在装包时物品i

可以装入,也可以不装,但不可拆开装。

即物品i可产生的效益为xi*pi,这里xi属于{0,1},c,wi,pi属于N+。

设计如何装包,所得装包总效益最大。

相关参数见下表

W1

15

P1

32

W2

17

P2

37

W3

20

P3

46

W4

12

P4

26

W5

9

P5

21

W6

14

P6

30

#include"stdio.h"

#defineN50

voidmain()

{

inti,j,c,cw,n,sw,sp,p[N],w[N],m[N][10*N];

printf("inputn:

");scanf("%d",&n);

printf("inputc:

");scanf("%d",&c);

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

{

printf("inputw%d,p%d:

",i,i);

scanf("%d,%d",&w[i],&p[i]);

}

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

if(j>=w[n])

m[n][j]=p[n];

else

m[n][j]=0;

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

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];

else

m[i][j]=m[i+1][j];

cw=c;

printf("c=%d\n",c);

printf("背包所

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1