算法设计与分析习题辅导.docx
《算法设计与分析习题辅导.docx》由会员分享,可在线阅读,更多相关《算法设计与分析习题辅导.docx(11页珍藏版)》请在冰豆网上搜索。
![算法设计与分析习题辅导.docx](https://file1.bdocx.com/fileroot1/2022-11/15/f4053f65-d200-49c0-b988-67250ee25200/f4053f65-d200-49c0-b988-67250ee252001.gif)
算法设计与分析习题辅导
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;xif(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("背包所