算法设计与分析-第2版-吕国英-第三章课后习题答案 (1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
3.2显示{5,7,4,8,9,1}的方阵方式
main()
{
int i,j,t,ori[6]={5,7,4,8,9,1};
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
t=(j-i)<0?j-i+6:j-i;
printf("%d ",ori[t]);}
printf("\n");
for(i=0;i<num;i++)
b[i]=-1;*/
printf("请输入您要转化的十六进制数\n");
scanf("%s",a);
sum=a[0]>=97&&a[0]<=102?a[0]-87:(a[0]>=65&&a[0]<=70?a[0]-55:a[0]-48);
printf("%d\n",sum);
if(dif(j2,j3,j4,j5))
{
a=i1*1000+i2*100+i3*10+i4;
b=10000+j2*1000+j3*100+j4*10+j5;
if(b%a==0)
{
num+=1;
printf("第%2d个:%d = %d * 2\n",num,b,a);
}
}
}
3.19
main()
{
char *a,*b;
else
printf("The string is not Huiwen!\n");
}
3.11
main()
{
int i,n,sum=0;//sum为零的个数
int zero(int pro);
printf("此程序用于计算1*2*3*…*n所得的数末尾有多少个零。\n");
printf("请输入n(1000<n<10000):");
printf("其它数字为:");
for(i=0;i<10;i++)
if(num[i]!='n')
printf("%c ",num[i]);
printf("\n");
printf("其它数字逆序输出为:");
for(i=9;i>=0;i--)
if(num[i]!='n')
printf("%c ",num[i]);
{
for(j=1;j<=n-i+1;j++)
{
if(j==1)
t=next;
else
t=t+i+j-1;
if(j==2)
next=t-1;
printf("%d ",t);
}
printf("\n");
}
}
//思想:每一行的第二个数为next,下一行的第一个数为next-1
3.5
main()
{
int n,i,j,k;
printf("ack(%d,%d)=%d\n",m,n,score);
}
int ack(int m,int n)
{
if(m==0)
return n+1;
else
if(n==0)
return ack(m-1,1);
else
return ack(m-1,ack(m,n-1));
}
3.8
main()
{
char str[40];
int i,l,t=1;
printf("Please input a string!\n");
scanf("%s",str);
l=strlen(str);
for(i=0;i<l/2;i++)
if(str[i]!=str[l-i-1])
t=0;
if(t)
printf("The string is Huiwen!\n");
int a,b;//a为四位数,首位应该最小为5;b为五位数,首位应为1,末尾为偶数
for(i1=5;i1<10;i1++)
for(i2=0;i2<10;i2++)
for(i3=0;i3<10;i3++)
for(i4=0;i4<10;i4++)
if(dif(i1,i2,i3,i4))
for(j2=0;j2<10;j2++)//首位j1为1
for(b=88;b<=90;b++)
if((b!=a)&&(b!=c))
printf("A<==>%c\nB<==>%c\nC<==>%c",a,b,c);
}
3.16
main()
{
int num[3]={4,7,9},flag[3]={0};
int n,i,sum;
printf("此程序用于判断该数能否被4,7,9整除,并输出相关信息。\n");
return 0;
else
return 1;
}
int dis(int m,int i,int j,int k,int l)
{
if(m==i||m==j||m==k||m==l)
return 0;
else
return 1;
}
void main()
{
int i1,i2,i3,i4,j2,j3,j4,j5,num=0;
int n,num,i,sum,dec;
printf("请输入您要输入的十六进制数的位数:n=");
scanf("%d",&n);
a=calloc(n,sizeof(char));
for(i=0;i<n;i++)
a[i]=0;
/*num=(int)(n*log10(16))+1;
b=calloc(num,sizeof(int));
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+zero(i);
sum+=n/10;
if((n%10)>5)
sum++;
printf("1*2*3*…*n所得的数末尾有%d个零。\n",sum);
}
int zero(int pro)
{
if(pro%1000==0)
return 3;
for(i=1;i<n;i++)
tem[1][n-i]=tem[1][n-i+1]+1
return **tem;
}
3.4
main()
{
int i,j,t=0,next=1,n;
printf("请输入n\n");
scanf("%d",&n);
printf("显示效果如下\n");
for(i=1;i<=n;i++)
for(i=1;i<strlen(a);i++)
{
dec=a[i]>=97&&a[i]<=102?a[i]-87:(a[i]>=65&&a[i]<=70?a[i]-55:a[i]-48);
printf("dec=%d\n",dec);
sum=sum*16+dec;
printf("sum=%d\n",sum);
int five[1024]={0};
for(j1=0;j1<4;j1++)
for(j2=0;j2<4;j2++)
for(j3=0;j3<4;j3++)
three[j1*16+j2*4+j3]=array[j1]*100+array[j2]*10+array[j3];
for(j1=0;j1<4;j1++)
printf("%d能被两个数整除,它是%d,%d\n",n,flag[0]?num[0]:num[1],flag[2]?num[2]:num[1]);
}
}
}
3.18
int dif(int i,int j,int k,int l)
{
if(i==j||i==k||i==l||j==k||j==l||k==l)
tem[1][1]=array[1][1]-pow(n+1,2);
for(i=1;i<=n;i++)
tem[1][i]=tem[1][i-1]+1;
for(i=1;i<=n;i++)
tem[n][i]=tem[n][i-1]+1;
for(i=1;i<=n;i++)
tem[n][n-i]=tem[n][n+1-i]+1;
sum=flag[0]+flag[1]+flag[2];
if(sum==1)
printf("%d能被一个数整除,它是%d\n",n,flag[0]?num[0]:flag[1]?num[1]:num[2]);
else
{
if(sum==3)
printf("%d能同时被4,7,9整除。\n");
else
{
for(k=0;k<n/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
}
else
{
for(k=0;k<(n+1)/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
}*///可将第一个for循环中的判断条件统一改为k<(n+1)/2
}
printf("%d",sum);
}
3.23
main()
{
int i,j,l;
char array[5];
char number[10]={'0','1','2','3','4','5','6','7','8','9'};
char num[10]={'0','1','2','3','4','5','6','7','8','9'};
int arr[100][100]={{0}};
//动态定义数组太难,所以在系统直接定义一个100*100的方阵,可以处理部分小问题
for(i=0;i<100;i++)
for(j=0;j<100;j++)
arr[i][j]=0;
printf("请输入n\n");
scanf("%d",&n);
/*if(n%2==0)
printf("\n");
}
3.25
main()
{
int i1,i2,i3,i4,i5,j1,j2,j3,j4,j5;
int array[4]={1,3,5,7};
int three[64]={0};
int two[16]={0};
int four[256]={0};
int four2[256]={0};
3.1//计算2+22+222+...+222……2
void main()
{
int i,n,sum=0;
print("请输入最后一个因子的位数\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+((int)pow(10,i)-1)/9*2;
print("2+22+222+...+222……2=%d\n",sum);
}
}
3.3
main()
{
int n;
int **up(int **array);
scanf("%d",&n);
int arr[1][1]={{n*n}};
for(j=1;j<n;j++)
arr=up(**arr,j);
}
int **up(int **array,n)
{
int upN=n+1;
int[upN][upN] tem;
printf("请输入一个5位以内的正整数。\n");
scanf("%s",array);
l=strlen(array);
printf("该数为%d位数。\n",l);
for(i=0;i<10;i++)
for(j=0;j<5;j++)
if(number[i]==array[j])
num[i]='n';//非数字即可
for(j3=0;j3<10;j3++)
for(j4=0;j4<10;j4++)
for(j5=0;j5<10;j5+=2)//末尾j5为偶数
if(dis(1,i1,i2,i3,i4)&&dis(j2,i1,i2,i3,i4)&&dis(j3,i1,i2,i3,i4)&&dis(j4,i1,i2,i3,i4)&&dis(j5,i1,i2,i3,i4)&&dis(1,j2,j3,j4,j5))
for(k=0;k<(n+1)/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
printf("显示效果如下:\n")
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%2d",arr[i][j]);
printf("\n");
}
}
3.7
main()
{
int ack(int m,int n);
int m,n,score;
printf("请输入ackermann函数的m,n:\n");
printf("m:");
scanf("%d",&m);
printf("n:");
scanf("%d",&n);
score=ack(m,n);
else
if(pro%100==0)
return 2;
else
if(pro%10==0)
return 1;
else
return源自文库0;
}
3.15
main()
{
int c,a,b;
for(c=88;c<=90;c++)
if((c!=88)&&(c!=90))
for(a=88;a<=90;a++)
if((a!=88)&&(a!=c))
printf("请输入n:");
scanf("%d",&n);
if(n%4!=0&&n%7!=0&&n%9!=0)
printf("%d不能被4,7,9任一个整除。\n",n);
else
{
if(n%4==0)
flag[0]=1;
if(n%7==0)
flag[1]=1;
if(n%9==0)
flag[2]=1;
3.2显示{5,7,4,8,9,1}的方阵方式
main()
{
int i,j,t,ori[6]={5,7,4,8,9,1};
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
t=(j-i)<0?j-i+6:j-i;
printf("%d ",ori[t]);}
printf("\n");
for(i=0;i<num;i++)
b[i]=-1;*/
printf("请输入您要转化的十六进制数\n");
scanf("%s",a);
sum=a[0]>=97&&a[0]<=102?a[0]-87:(a[0]>=65&&a[0]<=70?a[0]-55:a[0]-48);
printf("%d\n",sum);
if(dif(j2,j3,j4,j5))
{
a=i1*1000+i2*100+i3*10+i4;
b=10000+j2*1000+j3*100+j4*10+j5;
if(b%a==0)
{
num+=1;
printf("第%2d个:%d = %d * 2\n",num,b,a);
}
}
}
3.19
main()
{
char *a,*b;
else
printf("The string is not Huiwen!\n");
}
3.11
main()
{
int i,n,sum=0;//sum为零的个数
int zero(int pro);
printf("此程序用于计算1*2*3*…*n所得的数末尾有多少个零。\n");
printf("请输入n(1000<n<10000):");
printf("其它数字为:");
for(i=0;i<10;i++)
if(num[i]!='n')
printf("%c ",num[i]);
printf("\n");
printf("其它数字逆序输出为:");
for(i=9;i>=0;i--)
if(num[i]!='n')
printf("%c ",num[i]);
{
for(j=1;j<=n-i+1;j++)
{
if(j==1)
t=next;
else
t=t+i+j-1;
if(j==2)
next=t-1;
printf("%d ",t);
}
printf("\n");
}
}
//思想:每一行的第二个数为next,下一行的第一个数为next-1
3.5
main()
{
int n,i,j,k;
printf("ack(%d,%d)=%d\n",m,n,score);
}
int ack(int m,int n)
{
if(m==0)
return n+1;
else
if(n==0)
return ack(m-1,1);
else
return ack(m-1,ack(m,n-1));
}
3.8
main()
{
char str[40];
int i,l,t=1;
printf("Please input a string!\n");
scanf("%s",str);
l=strlen(str);
for(i=0;i<l/2;i++)
if(str[i]!=str[l-i-1])
t=0;
if(t)
printf("The string is Huiwen!\n");
int a,b;//a为四位数,首位应该最小为5;b为五位数,首位应为1,末尾为偶数
for(i1=5;i1<10;i1++)
for(i2=0;i2<10;i2++)
for(i3=0;i3<10;i3++)
for(i4=0;i4<10;i4++)
if(dif(i1,i2,i3,i4))
for(j2=0;j2<10;j2++)//首位j1为1
for(b=88;b<=90;b++)
if((b!=a)&&(b!=c))
printf("A<==>%c\nB<==>%c\nC<==>%c",a,b,c);
}
3.16
main()
{
int num[3]={4,7,9},flag[3]={0};
int n,i,sum;
printf("此程序用于判断该数能否被4,7,9整除,并输出相关信息。\n");
return 0;
else
return 1;
}
int dis(int m,int i,int j,int k,int l)
{
if(m==i||m==j||m==k||m==l)
return 0;
else
return 1;
}
void main()
{
int i1,i2,i3,i4,j2,j3,j4,j5,num=0;
int n,num,i,sum,dec;
printf("请输入您要输入的十六进制数的位数:n=");
scanf("%d",&n);
a=calloc(n,sizeof(char));
for(i=0;i<n;i++)
a[i]=0;
/*num=(int)(n*log10(16))+1;
b=calloc(num,sizeof(int));
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+zero(i);
sum+=n/10;
if((n%10)>5)
sum++;
printf("1*2*3*…*n所得的数末尾有%d个零。\n",sum);
}
int zero(int pro)
{
if(pro%1000==0)
return 3;
for(i=1;i<n;i++)
tem[1][n-i]=tem[1][n-i+1]+1
return **tem;
}
3.4
main()
{
int i,j,t=0,next=1,n;
printf("请输入n\n");
scanf("%d",&n);
printf("显示效果如下\n");
for(i=1;i<=n;i++)
for(i=1;i<strlen(a);i++)
{
dec=a[i]>=97&&a[i]<=102?a[i]-87:(a[i]>=65&&a[i]<=70?a[i]-55:a[i]-48);
printf("dec=%d\n",dec);
sum=sum*16+dec;
printf("sum=%d\n",sum);
int five[1024]={0};
for(j1=0;j1<4;j1++)
for(j2=0;j2<4;j2++)
for(j3=0;j3<4;j3++)
three[j1*16+j2*4+j3]=array[j1]*100+array[j2]*10+array[j3];
for(j1=0;j1<4;j1++)
printf("%d能被两个数整除,它是%d,%d\n",n,flag[0]?num[0]:num[1],flag[2]?num[2]:num[1]);
}
}
}
3.18
int dif(int i,int j,int k,int l)
{
if(i==j||i==k||i==l||j==k||j==l||k==l)
tem[1][1]=array[1][1]-pow(n+1,2);
for(i=1;i<=n;i++)
tem[1][i]=tem[1][i-1]+1;
for(i=1;i<=n;i++)
tem[n][i]=tem[n][i-1]+1;
for(i=1;i<=n;i++)
tem[n][n-i]=tem[n][n+1-i]+1;
sum=flag[0]+flag[1]+flag[2];
if(sum==1)
printf("%d能被一个数整除,它是%d\n",n,flag[0]?num[0]:flag[1]?num[1]:num[2]);
else
{
if(sum==3)
printf("%d能同时被4,7,9整除。\n");
else
{
for(k=0;k<n/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
}
else
{
for(k=0;k<(n+1)/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
}*///可将第一个for循环中的判断条件统一改为k<(n+1)/2
}
printf("%d",sum);
}
3.23
main()
{
int i,j,l;
char array[5];
char number[10]={'0','1','2','3','4','5','6','7','8','9'};
char num[10]={'0','1','2','3','4','5','6','7','8','9'};
int arr[100][100]={{0}};
//动态定义数组太难,所以在系统直接定义一个100*100的方阵,可以处理部分小问题
for(i=0;i<100;i++)
for(j=0;j<100;j++)
arr[i][j]=0;
printf("请输入n\n");
scanf("%d",&n);
/*if(n%2==0)
printf("\n");
}
3.25
main()
{
int i1,i2,i3,i4,i5,j1,j2,j3,j4,j5;
int array[4]={1,3,5,7};
int three[64]={0};
int two[16]={0};
int four[256]={0};
int four2[256]={0};
3.1//计算2+22+222+...+222……2
void main()
{
int i,n,sum=0;
print("请输入最后一个因子的位数\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+((int)pow(10,i)-1)/9*2;
print("2+22+222+...+222……2=%d\n",sum);
}
}
3.3
main()
{
int n;
int **up(int **array);
scanf("%d",&n);
int arr[1][1]={{n*n}};
for(j=1;j<n;j++)
arr=up(**arr,j);
}
int **up(int **array,n)
{
int upN=n+1;
int[upN][upN] tem;
printf("请输入一个5位以内的正整数。\n");
scanf("%s",array);
l=strlen(array);
printf("该数为%d位数。\n",l);
for(i=0;i<10;i++)
for(j=0;j<5;j++)
if(number[i]==array[j])
num[i]='n';//非数字即可
for(j3=0;j3<10;j3++)
for(j4=0;j4<10;j4++)
for(j5=0;j5<10;j5+=2)//末尾j5为偶数
if(dis(1,i1,i2,i3,i4)&&dis(j2,i1,i2,i3,i4)&&dis(j3,i1,i2,i3,i4)&&dis(j4,i1,i2,i3,i4)&&dis(j5,i1,i2,i3,i4)&&dis(1,j2,j3,j4,j5))
for(k=0;k<(n+1)/2;k++)
for(i=k;i<n-k;i++)
for(j=k;j<n-k;j++)
arr[i][j]=k+1;
printf("显示效果如下:\n")
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%2d",arr[i][j]);
printf("\n");
}
}
3.7
main()
{
int ack(int m,int n);
int m,n,score;
printf("请输入ackermann函数的m,n:\n");
printf("m:");
scanf("%d",&m);
printf("n:");
scanf("%d",&n);
score=ack(m,n);
else
if(pro%100==0)
return 2;
else
if(pro%10==0)
return 1;
else
return源自文库0;
}
3.15
main()
{
int c,a,b;
for(c=88;c<=90;c++)
if((c!=88)&&(c!=90))
for(a=88;a<=90;a++)
if((a!=88)&&(a!=c))
printf("请输入n:");
scanf("%d",&n);
if(n%4!=0&&n%7!=0&&n%9!=0)
printf("%d不能被4,7,9任一个整除。\n",n);
else
{
if(n%4==0)
flag[0]=1;
if(n%7==0)
flag[1]=1;
if(n%9==0)
flag[2]=1;