算法设计与分析习题辅导Word下载.docx
《算法设计与分析习题辅导Word下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析习题辅导Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
=%ld\n"
b);
//输出求解结果
}
2、试求含有数字7且不能被7整除的5位数的个数,并求这些整数的和。
#include<
stdio.h>
intc,j,m,n,f[10];
longd,k,g1,g2,s1,s2,t;
请输入一位整数m,n:
%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;
=10*t-1;
k++)//枚举每一个n位数
{d=k;
for(j=0;
j<
=9;
j++)f[j]=0;
for(j=1;
=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&
0)//k恰含2个数字m且不能m整除
{g2++;
s2+=k;
含数字%d且不能被%d整除的%d位整数的个数g1=%ld\n"
m,m,n,g1);
这些整数的和为s1=%ld\n"
s1);
恰含2个数字%d且不能被%d整除的%d位整数个数g2=%ld\n"
m,m,n,g2);
这些整数的和为s2=%ld\n"
s2);
3、韩信在点兵的时候,为了知道有多少个兵,同时又能保住军事机密,便让士兵排队报数。
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按1至7报数,记下最末一个报的数为4;
最后按1至11报数,最末一个士兵报的数为10。
编写程序计算韩信至少有多少兵?
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秒时反应堆裂变产生的α粒子和β粒子数。
intt,a=1,b=0,h,i;
%d"
h);
for(i=1;
i<
=h;
i++){
t=a;
a=b;
b=t*3+b*2;
%d,%d\n"
5、应用递归设计输出杨辉三角。
intn,i,j,k,a[20][20];
请输入行数n:
i++)
{a[i][1]=1;
a[i][i]=1;
}//确定初始条件
for(i=3;
i++)
for(j=2;
=i-1;
j++)//递推实施
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;
i++)//控制输出n行
{for(k=1;
=40-3*i;
printf("
"
=i;
printf("
%6d"
a[i][j]);
\n"
6、有一猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。
第2天早上又将剩下的桃子吃掉一半,又多吃了1个。
以后每天早上都吃了前一天剩下的一半后又多吃1个。
到第10天早上想再吃时,见只剩下1个桃子了。
编写程序计算第1天共摘了多少个桃子。
stdlib.h>
intmain()
{
inti,j;
j=1;
10;
{
j=2*(j+1);
}
第一天摘桃子的个数为%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("
for(i=1;
s=s+1.0/fun(i);
s=%f\n"
s);
8、把1,2,...,9这9个数字填入下式的9个方格中,数字不得重复,且要求1不得填在各分数的分母,且式中各分数的分子分母没有大于1的公因数,使下面的分数等式成立。
这一填数分数等式共有多少个解?
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]<
a[4])
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]!
a[7]!
=1)
{
s++;
printf("
(%2d)"
printf("
%ld/%d+%ld/"
m1,a[1],m2);
%d=%ld/%d"
a[4],m3,a[7]);
if(s%2==0)printf("
}
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]++;
共以上%d个解。
\n"
9、编写程序实现整数762191754639820463中删除6个数字后,剩下的数字按原次序组成一个新的正整数,所得最大整数为多大?
//贪心删数字大最大
#include"
inti,k,t,m,n,x,a[10000];
charb[100000];
请输入整数:
%s"
for(n=0,i=0;
b[i]!
='
\0'
{n++;
a[i]=b[i]-48;
删除数字个数:
scanf("
k);
以上%d位整数中删除%d个数字分别为:
n,k);
t=0;
m=0;
x=0;
i=t+1;
while(x<
k&
=n)
{if(t>
=0&
a[t]<
a[i])
{printf("
%d,"
a[t]);
a[t]=-1;
while(t>
a[t]==-1)
t--;
x=x+1;
elset=i++;
printf("
\n删除后所得最大数:
for(i=0,x=0;
x<
n-k;
if(a[i]!
=-1)
{printf("
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
#defineN50
inti,j,c,cw,n,sw,sp,p[N],w[N],m[N][10*N];
inputn:
inputc:
c);
printf("
inputw%d,p%d:
i,i);
scanf("
w[i],&
p[i]);
for(j=0;
=c;
if(j>
=w[n])
m[n][j]=p[n];
else
m[n][j]=0;
for(i=n-1;
i>
i--)
for(j=0;
if(j>
=w[i]&
m[i+1][j]<
m[i+1][j-w[i]]+p[i])
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);
背包所