算法设计五章习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析(第二版)习题答案(第五章)
主编:吕国英
习题答案
第五章
1.
#include
#include
#include
struct s_node
{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack=NULL;
void print_stack()
{
link temp=NULL;
temp=stack;
if(temp==NULL)
printf("The stack is empty!!\n");
else
{
while(temp!=NULL)//意思是如果temp=NULL的时候就不循环了
{
printf("[%d] ",temp->data);
temp=temp->next;
}
printf("\n");
}
}
int is_empty()
{
if(stack==NULL)
return 1;
else
return 0;
}
void push(char value)
{
link newnode;
//printf("\nThe stack content before(top->bottom):");
//print_stack();
newnode=(link)malloc(sizeof(s_list));
newnode->data=value;
newnode->next=stack;
stack=newnode;
}
int pop()
{
link top;
int temp;
//printf("\nThe stack content before(top->bottom):");
//print_stack();
if(stack!=NULL)
{
top=stack;
stack=stack->next;
temp=top->data;
free(top);
return temp;
}
else
return -1;
}
int is_op(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else
return 0;
}
int is_num(char ch)
{
if(ch<='9'&&ch>='0')
return 1;
return 0;
}
void test(char *buf)
{
int len;
int i;
len=strlen(buf);
for(i=0;i
if(buf[i]=='(')
{
if(buf[i+1]==')')
{
printf("无效的表达式\n");
break;
}
else
push(buf[i]);
}
if(is_op(buf[i]))
{
if(buf[i+1]==')')
{
printf("无效的表达式\n");
break;
}
}
if(is_num(buf[i]))
{
if(buf[i+1]=='(')
{
printf("无效的表达式\n");
break;
}
}
if(buf[i]==')')
{
if(pop()==-1)
{
printf("无效的表达式\n");
break;
}
}
}
if(is_empty())
{
printf("正确的表达式\n");
}
else
printf("无效的表达式\n");
}
int main()
{
char buf[100];
printf("输入代数表达式\n");
scanf("%s",buf);
test(buf);
return 0;
}
2.
#include
#define N 5 //N个数字
#define M 2 //M个加号
char buf[N];
int a[N];
char b[M+1][N];
int c[M+1];
int try(int t);
void swap(int t1,int t2);
int add();
void output();
int min=99999;
int main()
{
int i;
for(i=0;i
scanf("%c",&buf[i]);
}
a[0]=0;
for(i=1;i<=M;i++)
{
a[i]=1;
}
for(;i
a[i]=0;
}
try(1);
output();
printf("%d\n",min);
return 0;
}
int try(int t)
{
int j;
int i;
int sum;
if(t>=N)
{
sum=add();
if(sum
min=sum;
for(i=0;i
c[i]=atoi(b[i]);
}
}
/*
for(i=0;i
printf("%d",a[i]);
}
printf("\n");
*/
}
else
{
for(j=t;j
//if(a[t]!=a[j])
{
swap(t,j);
try(t+1);
swap(t,j);
}
//else
//try(t+1);
}
}
}
void swap(int t1,int t2)
{
int t;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
}
int add()
{
int sum=0;
int i=0;
int j;
int k=0;
int h=0;
for(i=0;i
i=0;
j=0;
h=0;
k=0;
for(j=0;j
if(a[j]==1)
{
h=0;
i++;
b[i][h]=buf[j];
//printf("%d ",atoi(b[i]));
//printf("%d %d %c \n",i,h,b[i][h]);
h++;
}
else
{
b[i][h]=buf[j];
//printf("%d %d %c \n",i,h,b[i][h]);
//printf("%d ",atoi(b[i]));
h++;
}
}
/*
for(i=0;i
for(j=0;j
printf("\n");
}
*/
for(i=0;i
sum+=atoi(b[i]);
}
return sum;
}
void output()
{
int i;
for(i=0;i
printf("%d",atoi(b[i]));
if(i!=M)
printf("+");
}
printf("=");
}
3.
#include
#define N 9
int buf[N]={2,3,4,5,6,8,10,12,15};
void fenshu_add(int fenzi1,int fenmu1,int fenzi2,int fenmu2,int *fenzi,int *fenmu);
void try(int t);
void swap(int t1,int t2);
int SUM[100];
int count=0;
int main()
{
int i;
for(i=0;i<100;i++)
SUM[i]=0;
try(0);
}
void fenshu_add(int fenzi1,int fenmu1,int fenzi2,int fenmu2,int *fenzi,int *fenmu)
{
*fenmu=fenmu1*fenmu2;
*fenzi=fenzi1*fenmu2+fenzi2*fenmu1;
}
void try(int t)
{
int j;
if(t>=N)
{
int bool=0;
int sum;
int k;
int i;
int fenzi,fenmu;
fenzi=1;
fenmu=buf[0];
for(i=1;i
fenshu_add(1,buf[i],fenzi,fenmu,&fenzi,&fenmu);
if(fenzi==fenmu)
{
sum=0;
for(k=0;k<=i;k++)
{
//printf("1/%d ",buf[k]);
sum+=buf[k];
}
k=0;
for(k=0;k<=count;k++)
{
if(sum==SUM[k])
{
bool=1;
break;
}
}
if(k==count+1)
{
SUM[count++]=sum;
for(k=0;k<=i;k++)
printf("1/%d ",buf[k]);
printf("\n");
break;
}
if(bool==1)
break;
}
}
}
else
{
for(j=t;j
swap(t,j);
try(t+1);
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
int t;
t=buf[t1];
buf[t1]=buf[t2];
buf[t2]=t;
}
4.
#include
#define N 9
int buf[N];
void try(int t);
void output();
int is_right();
void swap(int t1,int t2);
int main()
{
int i;
for(i=0;i
try(0);
return 0;
}
void try(int t)
{
int j;
if(t>=N)
{
if(is_right())
output();
}
else
for(j=t;j
swap(t,j);
try(t+1);
swap(t,j);
}
}
void output()
{
int j;
for(j=0;j
printf("\n");
}
int is_right()
{
int i;
int sum=0;
for(i=0;i
sum*=10;
sum+=buf[i];
if(sum%(i+1)!=0)
return 0;
}
return 1;
}
void swap(int t1,int t2)
{
int t;
t=buf[t1];
buf[t1]=buf[t2];
buf[t2]=t;
}
5.
#include
int divintege
r(int n,int m);
int main()
{
int n;
printf("n=?\n");
scanf("%d",&n);
printf("%d\n",divinteger(n,n));
return 0;
}
int divinteger(int n,int m)
{
if(n<1||m<1)
{
printf("error");
}
else
if(n==1||m==1)
{
return 1;
}
else
if(n
else
if(n==m)
return 1+divinteger(n,n-1);
else
return divinteger(n,m-1)+divinteger(n-m,m);
}
6.
#include
#define N 8
int jz[N][N]={
{0,12,14,8,32,23,21,10},
{12,0,54,4,7,63,34,15},
{14,54,0,90,9,43,13,31},
{8,4,90,0,87,44,55,66},
{32,7,9,87,0,30,29,28},
{23,63,43,44,30,0,85,58},
{21,34,13,55,29,85,0,3},
{10,15,31,66,28,58,3,0}
};
char buffer[N]={'A','B','C','D','E','F','G','H'};
int buf[N]={0,1,2,3,4,5,6,7};
int sum=9999;
int temp[N];
void try(int t);
void swap(int t1,int t2);
int is_smaller();
int main()
{
int i;
int a;
try(1);
for(i=0;i
a=temp[i];
printf("%c",buffer[a]);
}
printf("A");
printf("\n");
return 0;
}
void try(int t)
{
int j;
int i;
if(t>=N)
{
if(is_smaller())
{
for(i=0;i
}
}
else
{
for(j=t;j
swap(t,j);
try(t+1);
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
int t;
t=buf[t1];
buf[t1]=buf[t2];
buf[t2]=t;
}
int is_smaller()
{
int add=0;
int i;
int a,b;
for(i=0;i
a=buf[i];
b=buf[i+1];
add+=jz[a][b];
}
a=buf[N-1];
b=buf[0];
add+=jz[a][b];
if(add
sum=add;
return 1;
}
return 0;
}
7.
#include
#define M 3
#define N 4
int r[M]={3,2,1};
int q[N]={2,1,1,2};
int buf[M*N];
int count=-1;
int temp[100][M*N];
void try(int t);
void swap(int t1,int t2);
int is_right();
int is_exist();
void output();
int main()
{
int i;
int j;
int sum=0;
for(i=0;i
for(i=0;i
try(0);
return 0;
}
void try(int t)
{
int j;
if(t>=M*N)
{
if(is_right())
output();
}
else
{
for(j=t;j
swap(t,j);
try(t+1);
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
int t;
t=buf[t1];
buf[t1]=buf[t2];
buf[t2]=t;
}
int is_right()
{
int i;
int j;
int sum;
for(i=0;i
sum=0;
for(j=0;j
sum+=buf[i*N+j];
}
if(sum!=r[i])
return 0;
}
for(i=0;i
sum=0;
for(j=0;j
sum+=buf[j*N+i];
}
if(sum!=q[i])
return 0;
}
return 1;
}
void output()
{
int i;
int j;
if(is_exist()==0)
{
count++;
for(i=0;i
for(j=0;j
printf("%d ",buf[i*N+j]);
temp[count][i*N+j]=buf[i*N+j];
}
printf("\n");
}
printf("\n\n");
}
}
int is_exist()
{
int i;
int j;
if(count==-1)
return 0;
else
{
for(i=0;i<=count;i++)
{
if(is_same(i))
return 1;
}
return 0;
}
}
int is_s
ame(int t)
{
int i;
for(i=0;i
return 0;
return 1;
}
8.
//有N个硬币,每次翻N-1个硬币
//直到全部硬币翻转,必须是偶数
#include
#define N 100
int main()
{
int i,count=0;
int j;
int num;
char coin[N];
printf("Please input the num of coin(偶数):");
scanf("%d",&num);
for(i=0;i
coin[i]='*';
}
printf("The coin is : ");
for(i=0;i
printf(" %c ",coin[i]);
}
printf("\n");
printf("\n");
for(i=0;i
for(j=0;j
if(coin[j]=='*')
{
coin[j]='0';
}
else
{
coin[j]='*';
}
}
if(coin[i]=='*') /*第i个再变一次,即不变*/
{
coin[i]='0';
}
else
{
coin[i]='*';
}
count++;
printf("The No.%-4d : ",count);
for(j=0;j
printf(" %c ",coin[j]);
}
printf("\n");
}
printf("Tatal time is : %d\n",count);
}
9.
#include
void getti(int a,int y,int z);
int i; /*最后需要分出的重量*/
int main()
{
int a,y,z;
printf("input Full a,Empty b,c,Get i:"); /*a 满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
scanf("%d,%d,%d,%d",&a,&y,&z,&i);
getti(a,y,z); /*按a -> y -> z -> a的操作步骤*/
getti(a,z,y); /*按a -> z -> y -> a的步骤*/
return 0;
}
void getti(int a,int y,int z) /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量*/
{
int b=0,c=0; /* b:第一瓶实际的重量 c:第二瓶实际的重量*/
printf(" a%d b%d c%d\n %4d%4d%4d\n",a,y,z,a,b,c);
while(a!=i||b!=i&&c!=i) /*当满瓶!=i或另两瓶都!=i*/
{
if(!b)
{
a-=y;
b=y;
} /*如果第一瓶为空,则将满瓶倒入第一瓶中*/
else
if(c==z)
{
a+=z;
c=0;
} /*如果第二瓶满,则将第二瓶倒入满瓶中*/
else
if(b>z-c) /*如果第一瓶的重量>第二瓶的剩余空间*/
{
b-=(z-c);
c=z;
} /*则将装满第二瓶,第一瓶中保留剩余部分*/
else
{
c+=b;
b=0;
} /*否则,将第一瓶全部倒入第二瓶中*/
printf(" %4d %4d %4d\n",a,b,c);
}
}
10.
#include
#define N 5
int a[N];
int c[N*2],d[N*2];
int buf[N][N]={
{10,11,10,4,7},
{13,10,10,8,5},
{5,9,7,7,4},
{15,12,10,1
1,5},
{10,11,8,8,4}
};
int max=0;
int maxa[N];
void try(int t);
void swap(int t1,int t2);
int main()
{
int i;
for(i=0;i
for(i=0;i
c[i]=0;
c[N+i]=0;
d[i]=0;
d[N+i]=0;
}
try(0);
printf("max=%d\n",max);
printf("A B C D E\n");
for(i=0;i
printf("\n");
return 0;
}
void try(int t)
{
int j;
if(t>=N)
{
int i;
int sum=0;
for(i=0;i
if(sum>max)
{
max=sum;
for(i=0;i
}
}
else
{
for(j=t;j
swap(t,j);
if(c[t+a[t]]==0&&d[t-a[t]+N]==0)
{
c[t+a[t]]=1;
d[t-a[t]+N]=1;
try(t+1);
c[t+a[t]]=0;
d[t-a[t]+N]=0;
}
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
int t;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
}
11.
#include
#define N 5
int a[N];
int c[N*2],d[N*2];
int buf[N][N]={
{10,11,10,4,7},
{13,10,10,8,5},
{5,9,7,7,4},
{15,12,10,11,5},
{10,11,8,8,4}
};
int max=0;
int maxa[N];
void try(int t);
void swap(int t1,int t2);
int main()
{
int i;
for(i=0;i
for(i=0;i
c[i]=0;
c[N+i]=0;
d[i]=0;
d[N+i]=0;
}
try(0);
printf("max=%d\n",max);
printf("A B C D E\n");
for(i=0;i
printf("\n");
return 0;
}
void try(int t)
{
int j;
if(t>=N)
{
int i;
int sum=0;
for(i=0;i
if(sum>max)
{
max=sum;
for(i=0;i
}
}
else
{
for(j=t;j
swap(t,j);
if(c[t+a[t]]==0&&d[t-a[t]+N]==0)
{
c[t+a[t]]=1;
d[t-a[t]+N]=1;
try(t+1);
c[t+a[t]]=0;
d[t-a[t]+N]=0;
}
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
int t;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
}
12.
#include
void try(int n);
int main()
{
int n;
scanf("%d",&n);
try(n);
return 0;
}
void try(int n)
{
int i;
int sum=0;
int first=1,end=1;
while(end<=n/2+2)
{
if(sum
sum+=end;
end++;
}
else
if(sum==n)
{
for(i=first;i
printf("\n");
sum+=end;
end++;
}
else
if(sum>n)
{
first++;
sum-=(first-1);
}
}
}