算法设计与分析-第2版-吕国英-第三章课后习题答案 (1)
算法设计与分析基础第2版清华出版社算法分析第3章
任务1
人员1 9 人员2 6 人员3 5 人员4 7
任务2
2 4 8 6
任务3
7 3 1 9
任务4
8 7 8 4
<1,2,3,4> <1,2,4,3> <1,3,2,4> <1,3,4,2> <1,4,2,3> <1,4,3,2>
9 2 7 8
C
6
4
3
7
5 8 1 8
7
n1 n
n1
C(n)22(ni)
i1ji1
i1
2[n (1)(n2).. .1](n1)n(n2)
3.3.2 凸包问题
定义 对于平面一的一个点集合(有限的或无限的),如 果以集合中任意两点P和Q为端点的线段都属于该集合, 我们说这个集合是凸的。
定义 一个点集合S的凸包是包含S的最小凸集合(“最小” 意指,S的凸包一定是所有包含S的凸集合的子集)。
物品2
(a)
物品3 物品4
子集
ø {1} {2} {3} {4} {1,2} {1,3} {1,4} {2,3} {2,4}
{3,4}
{1,2,3} {1,2,4} {1,3,4} {2,3,4} {1,2,3,4}
总重量
0 7 3 4 5 10 11 12 7 8
9
14 15 16 12 19
总价值
3.1 选择排序和冒泡排序
3.1.1选择排序
A0≤A1≤…Ai-1|Ai ,…,Amin ,…, An-1
已经位于最终的位 置上了
最后的n-1个元素
算法 SelectionSort(A[0..n-1]) //该算法用选择排序对给定的数组排序 //输入:一个可排序数组A[0..n-1] //输出:非降序排序的数组A[0..n-1] for i←0 to n-2 do
算法设计与分析第二版课后习题解答
算法设计与分析第二版课后习题解答算法设计与分析基础课后练习答案习题 4.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求//输入:一个正整数n2//输出:。
step1:a=1;step2:若a*a 5. a.用欧几里德算法求gcd。
b. 用欧几里德算法求gcd,比检查min{m,n}和gcd间连续整数的算法快多少倍?请估算一下。
a. gcd(31415, 14142) = gcd(14142, 3131) = gcd(3131, 1618) =gcd(1618, 1513) = gcd(1513,105) = gcd(1513, 105) = gcd(105, 43) =gcd(43, 19) = gcd(19, 5) = gcd(5, 4) = gcd(4, 1) = gcd(1, 0) = 1.b.有a可知计算gcd欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和 2·14142之间,所以欧几里德算法比此算法快1·14142/11 ≈ 1300 与 2·14142/11 ≈ 2600 倍之间。
6.证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? Hint:对于任何形如0 gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次) b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次) gcd(5,8) 习题 1.(农夫过河)P—农夫 W—狼G—山羊C—白菜 2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数) 算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法 //输入:实系数a,b,c//输出:实根或者无解信息 If a≠0D←b*b-4*a*c If D>0temp←2*ax1←(-b+sqrt(D))/temp x2←(-b-sqrt(D))/temp return x1,x2else if D=0 return –b/(2*a) else return “no real roots” else //a=0if b≠0 return –c/b else //a=b=0if c=0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法 a.用文字描述 b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n 第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出 b.伪代码算法 DectoBin(n)//将十进制整数n转换为二进制整数的算法 //输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中 i=1while n!=0 do { Bin[i]=n%2; n=(int)n/2; i++; } while i!=0 do{ print Bin[i]; i--; }9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进. 算法 MinDistance(A[0..n-1]) //输入:数组A[0..n-1] //输出:the smallest distance d between two of its elements习题1. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗? 解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count 4.(古老的七桥问题) 第2章习题7.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n)∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
算法分析与设计第二版习题答案-第三章到第五章
算法设计与分析(第二版)习题答案主编:吕国英算法设计与分析(第二版)习题答案(第三章)第三章:1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");scanf("%d",&n);buf=(int *)malloc(n*sizeof(int));for(i=0;i<n;i++){buf[i]=2;}for(i=n-2;i>=0;i--){for(j=i;j>=0;j--){buf[j]+=2;}}for(k=0;k<=n-2;k++){if(buf[k]>=10){buf[k+1]+=buf[k]/10;buf[k]%=10;}}for(i=n-1;i>=0;i--)printf("%d",buf[i]);printf("\n");return 0;}2.#include<stdio.h>int main(int argc,char **argv){int buf[6][6];int i,j;printf("任意输入6个数字:");for(i=0;i<6;i++) scanf("%d",&buf[0][i]);for(i=0;i<5;i++){ for(j=0;j<5;j++) { buf[i+1][j+1]=buf[i][j]; } buf[i+1][0]=buf[i][j];}for(i=0;i<6;i++){ for(j=0;j<6;j++) printf("%d ",buf[i][j]); printf("\n");}return 0;}3.#include<stdio.h>#define N 7int main(int argc,char **argv){int buf[N][N];int i,j,k,m,n;int a=0,b=N-1;intcount=1;for(i=0;i<(N/2)+(N%2);i++){ for(j=a;j<=b;j++) { buf[a][j]=count++; } f or(k=a+1;k<=b;k++) { buf[k][b]=count++; } for(m=b-1;m>=a;m--) { buf[b][m]=count++; } for(n=b-1;n>a;n--) { buf[n][a]=count++; } a++; b--;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return 0;}4.#include<stdio.h>#define N 5int main(int argc,char **argv){int buf[N][N];inti,j,k;int count=1;int n=0;for(i=0;i<N;i++){ for(k=0,j=n;j>=0;j--,k++) buf[j][k]=count++; n++;}for(i=0;i<N;i++){ for(j=0;j<N-i;j++) printf("]",buf[i][j]); printf("\n");}return 0;}5.#include<stdio.h>#define N 5int main(int argc,char **argv){int buf[N][N];int i,j;int a=0,b=N-1;intcount=1;for(i=0;i<N/2+N%2;i++){ for(j=a;j<=b;j++) buf[a][j]=count; for(j=a+1;j<= b;j++) buf[j][b]=count; for(j=b-1;j>=a;j--) buf[b][j]=count; for(j=b-1;j>a;j--) buf[j][a]=count; count++; a++; b--;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return 0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list*link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode->flag=flag;newnode->next=NULL;if(top==NULL) { top=newnode; }else { newnode->next=top; top=newnode; }}int pop(){int flag;linkstack;if(top!=NULL) { stack=top; top=top->next; flag=stack->flag; free(stack); }return flag;}int op(char ch){switch(ch) { case '+': return 1; break; case '-': return 2; break; case '*': return 3; break; case'/': return 4; break; default: return 5; }}void nirnava(char *buf,intcount)//count个数,buf数组{int bool=1;int min;int j;int i;int k;int flag;for(i=0;i<count;i++){if(buf[i]=='(')push(buf[i],i);if(buf[i]==')'){flag=pop();if(flag!=0){if((buf[flag-1]=='(')&&(buf[i+1]==')')){buf[flag]='!';buf[i]='!';}}min=op(buf[flag]);for(j=flag+1;j<i;j++){if(buf[j]=='('){push(buf[j],j);bool=0;continue;}elseif(buf[j]==')'){pop();bool=1;continue;}if(bool==1){if(min>op(buf[j]))min=op(buf[j]);}}if(i<count-1){if((buf[i+1]=='+')||(buf[i+1]=='-')){if(flag==0){buf[i]='!';buf[flag]='!';}elseif(op(buf[flag-1])<=min){buf[i]='!';buf[flag]='!';}}elseif((buf[i+1]=='*')||(buf[i+1]=='/')){if(flag==0){buf[i]='!';buf[flag]='!';}elseif((min>=op(buf[i+1])&&op(buf[flag-1])<=min)) {buf[i]='!';buf[flag]='!';}}}elseif(i==count-1){if(flag==0){buf[i]='!';buf[flag]='!';}elseif(op(buf[flag-1])<=min){buf[i]='!';buf[flag]='!';}}}}for(k=0;k<count;k++){if(buf[k]!='!')printf("%c",buf[k]);}printf("\n");}int main(void){char buf[255];int i;for(i=0;i<255;i++){scanf("%c",&buf[i]);if(buf[i]=='\n')break;}buf[i]='\0';nirnava(buf,i);return 0;}7.#include<stdio.h>#include<stdlib.h>int ack(int m,int n);int count=0;int main(int argc,char **argv){intm,n;scanf("%d%d",&m,&n);printf("%d\n",ack(m,n));printf("%d\n",count);return 0;}int ack(int m,int n){count++;if(m==0) return n+1;else if(n==0) return ack(m-1,1); else return ack(m-1,ack(m,n-1));}8.#include<stdio.h>char buf[1024];intis_huiwen(int a,int count){if(a==count/2) { return1; }else if(buf[a]==buf[count-a-1]) return (is_huiwen(a-1,count))&&1; else {return 0; }}int main(void){int count;inti;for(i=0;i<1024;i++) { scanf("%c",&buf[i]); if(buf[i]=='\n')break; }count=i;i--;printf("%d",is_huiwen(i,count));return 0;}9.#include<stdio.h>char buf[100];int pos(int a,int b){if(b-a==1) return 1;else if(b-a==0) return 1; else return pos(a,b-1)+pos(a,b-2);}int main(void){inta,b;scanf("%d%d",&a,&b);printf("%d",pos(a,b));return 0;}10.#include<stdio.h>#define MAX 1024int buf[MAX];int main(void){int m,n;inti;scanf("%d%d",&m,&n);for(i=0;i<MAX;i++) buf[i]=0;i=0;while(buf[i%m]==0) { buf[i%m]=1; i+=n; }for(i=0;i<m;i++) { if(buf[i]==0)printf("%d",i); }return 0;}11.#include<stdio.h>int main(void){int temp,temp1;int count=0;int n;inti;scanf("%d",&n);for(i=1;i<=n;i++) { temp=i; if(temp==5)count++; elseif(te mp==0) { temp1=i; while((temp1)==0) { temp1=temp1/10; count++; } } }printf("%d",count);return 0;}12.#include<stdio.h>int main(void){int count=0;int buf[53];inti,n;for(i=1;i<53;i++) { buf[i]=1; }for(n=2;;n++) { for(i=n;i<53;i+=n){ buf[i ]=1-buf[i]; count++; if(count>=104) break;} if(count>=104)break; }for(i=1;i<53;i ++) { if(buf[i]==1)printf("%d ",i); }printf("\n");return 0;}13.#include<stdio.h>int main(void){inta,b,c,d,e;for(a=1;a<=5;a++) for(b=1;b<=5;b++) if(a!=b)for(c=1;c<=5;c++) if(c!=a &&c!=b) for(d=1;d<=5;d++) if(d!=a&&d!=b&&d!=c) { e=15-a-b-c-d; if(e!=a&&e!=b&&e!=c&&e!=d) if(((b==3)+(c==5)==1)&&((d==2)+(e==4)==1 )&&((b==1)+(e==4)==1)&&((c==1)+(b==2)==1)&&((d==2)+(a==3)==1)) printf(" a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e); }return 0;}14.#include<stdio.h>int main(void){int buf[3];int i;int mul;inttemp;for(i=10;i<=31;i++) { mul=i*i; temp=mul; buf[0]=temp; temp=temp /10; buf[1]=temp; temp=temp/10; buf[2]=temp; if((buf[0]==buf[1])||(buf[0] ==buf[2])||(buf[1]==buf[2])){ printf("%d^2=%d\n",i,mul);} }return0;}15.#include<stdio.h>int main(void){inta,b,c;for(a=1;a<=3;a++) for(b=1;b<=3;b++) if(a!=b){ c=6-a-b; if(c!=a&&c!=b) if((a!=1)&&((c!=1)&&(c!=3))==1) printf("a=%d,b=%d,c=% d",a,b,c);}return 0;}16.#include<stdio.h>int main(void){int k;intn;scanf("%d",&n);k=(n%4==0)+(n%7==0)*2+(n%9==0)*4;switch(k) { case7: printf("all"); break; case 6: printf("7 and 9"); break; case5: printf("4 and 9"); break; case 4: printf("9"); break; case 3: printf("4 and 7"); break; case 2: printf("7"); break; case1: printf("4"); break; case 0: printf("none"); break; }return0;}17.#include<stdio.h>int main(void){int a,b,c,d;printf("please think of a number between 1 and 100.\n");printf("your number divided by 3 has a remainder of");scanf("%d",&a);printf("your number divided by 4 has a remainder of");scanf("%d",&b);printf("your number divided by 7 has a remainder of");scanf("%d",&c);printf("let me think amoment...\n");d=36*c+28*a+21*b;while(d>84) d=d-84;printf("your numberwas %d\n",d);return 0;}18.#include<stdio.h>int main(void){int buf[10];int i,j;int mul;int temp1,temp2;intbool;for(i=5000;i<=9999;i++) { bool=0; for(j=0;j<10;j++)buf[j]=0; temp1=i; while(temp1>0){ if((++buf[temp1])>1) { bool=1; break; } temp1/=10; } if(bool==1)continue; mul=i*2; temp2=mul; while(temp2>0){ if((++buf[t emp2])>1) { bool=1; break; } temp2/=10;} if(bool==1)continue; pri ntf("2*%d=%d\n",i,mul); }return 0;}19.#include<stdio.h>#include<stdlib.h>int ppow(int a,int b){int mul=1;int i;for(i=0;i<b;i++) { mul=a*mul; }return mul;}int main(void){int t;char buf[10];int i,j,k;intsum=0;for(i=0;i<10;i++) { scanf("%c",&buf[i]); if(buf[i]=='\n')break; }buf[i]= '\0';for(j=0;j<i;j++) { if((buf[j]>='0')&&(buf[j]<='9'))buf[j]=buf[j]-48; elseif((buf[j]>='A')&&(buf[j]<='F')) buf[j]=buf[j]-55;else exit(1); }k=0;for(j=i-1;j>=0;j--) { t=ppow(16,k); sum=sum+t*(int)buf[j]; k++; }printf("%d\n",sum);return 0;}20.#include<stdio.h>int main(void){int a;int b;int c;int i;intbuf[10];for(a=10;a<=99;a++) { for(i=0;i<10;i++)buf[i]=0; if((++buf[a]>1)||(++b uf[a/10]>1))continue; for(b=100;b<=999;b++){ for(i=0;i<10;i++) { if((i!=a)& &i!=a/10) buf[i]=0; } if((++buf[b]>1)||(++buf[b/10]>1)||(++buf[b/100]>1)) conti nue; c=a*b; if(c<10000&&c>999) { if((++buf[c]>1)||(++buf[c/10]>1)||(++buf[c /100]>1)||(++buf[c/1000]>1)) continue; else printf("%d*%d=%d\n",a,b,c); }} }return 0;}21.#include<stdio.h>int main(void){int a;int b;int i;int t;int buf[10];int bool;for(a=317;a<1000;a++) { bool=0; for(i=0;i<10;i++)buf[i]=0; if((++buf[ a]>1)||(++buf[a/10]>1)||(++buf[a/100]>1))continue; b=a*a; t=b; for(i=0;i<6;i++ ){ if(++buf[t]>1) { bool=1; break; } t=t/10;} if(bool==1)continue; p rintf("%d^2=%d\n",a,b); }return 0;}22.#include<stdio.h>int main(void){intbuf[100];int i;int n;int max;inttemp;for(i=1;i<100;i++) { scanf("%d",&buf[i]); if(buf[i]==0)break; }n=i;max =buf[1]+buf[2]+buf[3]+buf[4];for(i=2;i!=1;i++) { temp=buf[i]+buf[(i+1)]+buf[(i+2 )]+buf[(i+3)]; if(temp>max)max=temp; }printf("max=%d\n",max);return0;}23.#include<stdio.h>void nirnava(int n){if(n<10) printf("%d",n);else { nirnava(n/10); printf("%d ",n); }}int main(void){int count=0;int n;int i;int t;scanf("%d",&n);t=n;while(t>0) { printf("%d",t); t=t/10; count++; }printf("\n");nirnava(n);printf("\n%d位数\n",count);}24.#include<stdio.h>int main(void){int buf[4]={2,3,5,7};int i,j,k,temp,m;int bool;int mul;for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(m=0;m<4;m++){bool=0;mul=(buf[i]+buf[j]*10+buf[k]*100)*buf[m];if(mul<1000)continue;temp=mul;while(temp>0){if((temp==2)||(temp==3)||(temp==5)||(temp==7)){}else{bool=1;break;}temp/=10;}if(bool==0){printf("%d%d%d * %d = %d\n",buf[k],buf[j],buf[i],buf[m],mul); }}return 0;}25.#include<stdio.h>int main(void){int buf[4]={2,3,5,7};int i,j,k,m,n;int bool;int mul,mul1,mul2;int temp,temp1,temp2;for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(m=0;m<4;m++)for(n=0;n<4;n++){bool=0;mul=(buf[i]+buf[j]*10+buf[k]*100)*(buf[m]+buf[n]*10);mul1=(buf[i]+buf[j]*10+buf[k]*100)*buf[m];mul2=(mul-mul1)/10;if((mul<10000)||(mul1<1000)||(mul2<1000))continue;temp=mul;temp1=mul1;temp2=mul2;while(temp>0){if((temp==2)||(temp==3)||(temp==5)||(temp==7)){}else{bool=1;break;}temp/=10;}if(bool==0){while(temp1>0){if((temp1==2)||(temp1==3)||(temp1==5)||(temp1==7)){}else{bool=1;break;}temp1/=10;}}if(bool==0)while(temp2>0){if((temp2==2)||(temp2==3)||(temp2==5)||(temp2==7)){}else{bool=1;break;}temp2/=10;}if(bool==0){printf("第一行: %d%d%d\n第二行: %d%d\n第三行: %d\n第四行: %d\n第五行: %d\n\n\n\n\n",buf[i],buf[j],buf[k],buf[m],buf[n],mul1,mul2,mul);}}return 0;}26.#include<stdio.h>//从a到b是不是循环节int is_xunhuan(int *buf,int a,int b) {int i;if(a==b){for(i=1;i<10;i++){if(buf[a]==buf[a+i]){}elsereturn 0;}}elsefor(i=a;i<=b;i++){if(buf[i]==buf[i+b-a+1]){}else{return 0;}}return 1;}int main(void){int buf[1024];int yushu;int m,n;int i,j,k;scanf("%d%d",&m,&n);yushu=m;buf[0]=0;i=1;while(yushu!=0){yushu=yushu*10;buf[i]=yushu/n;yushu=yushu%n;i++;if(i==1024)break;}if(i<1024){printf("有限小数\n");printf("%d.",buf[0]);for(j=1;j<i;j++)printf("%d",buf[j]);printf("\n");}else{printf("循环小数\n");for(i=1;i<100;i++)for(j=i;j<200;j++){if(is_xunhuan(buf,i,j)){printf("%d.",buf[0]);if(i>1){for(k=1;k<i;k++)printf("%d",buf[k]);}printf("(");for(k=i;k<=j;k++)printf("%d",buf[k]);printf(")");printf("\n");return 0;}}}return 0;}27.#include<stdio.h>int main(void){int n;char eng[12][10]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};scanf("%d",&n);printf("%s\n",eng[n-1]);return 0;}第四章1.#include<stdio.h>int main(void){int buf[100];int n;int i,j,k;scanf("%d",&n);for(i=0;i<n;i++)buf[i]=2;for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++) {buf[j]+=2;}}for(j=0;j<n;j++){if(buf[j]>=10) {buf[j+1]+=buf[j]/10; buf[j]=buf[j];}}for(i=n-1;i>=0;i--)printf("%d",buf[i]); printf("\n");return 0;}2.#include<stdio.h>int main(void){int n=2;int i;for(i=1;i<=9;i++){n=(n+2)*2;}printf("%d\n",n);return 0;}3.#include<stdio.h>int main(void){int a=54;int n;int m;printf("计算机先拿3张牌\n");a=a-3;while(a>=0){printf("还剩%d张牌\n",a);printf("你拿几张?请输入:");scanf("%d",&n);if(n>4||n<1||n>a){printf("错误!重新拿牌\n");continue;}a=a-n;printf("还剩%d张牌\n",a);if(a==0)break;m=5-n;printf("计算机拿%d\n",m);a=a-m;}return 0;}4.#include<stdio.h>int d;int a1,a2;int fun(int n);int main(void){int n;printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a1,&a2); printf("%d\n",fun(n));return 0;}int fun(int n){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5.#include<stdio.h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n);int main(void){int i,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]='X';queen(0,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c ",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){int i,j;for(i=0;i<8;i++) { if(chess[row][i]=='Q')return 0; if(chess[i][col]=='Q')return 0; }i=row;j=col;while(i!=-1&&j!=-1) { if(chess[i--][j--]=='Q')return 0; }i=row;j=col;while(i!=-1&&j!=8) { if(chess[i--][j++]=='Q')return 0; }i=row;j=col;while(i!=8&&j!=-1) { if(chess[i++][j--]=='Q')return0; }i=row;j=col;while(i!=8&&j!=8) { if(chess[i++][j++]=='Q')return 0; }return 1;}int queen(int row,int col,int n){int i,j;int result=0;if(n==8) return1;else if(is_safe(row,col)) {chess[row][col]='Q';for(i=0;i<8;i++) for(j=0;j<8;j++) { result+=queen(i,j,n+1); if(result>0) break; }if(result>0) return1;else { chess[row][col]='X'; return 0; } } else return0;}6.#include<stdio.h>int main(void){inti,j,k;for(i=1;i<=33;i++) for(j=1;j<=50;j++) {k=100-i-j;if(k%2==0) { if(3*i+2*j+k/2==100) printf("大马%d\n中马%d\n小马%d\n\n\n",i,j,k);}}return 0;}7.#include<stdio.h>int main(void){int i;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) printf("%d\n",i);}return 0;}8.#include<stdio.h>int main(void){int i;int sum;int a1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i;a2=i/10;if(a1!=a2){a3=i/100;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!=a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i%sum==0)printf("%d\n",i);}}}}return 0;}9.#include<stdio.h>#define N 10void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2);int main(void){int a[N]={2,3,4,5,34,7,9,6,43,21};int min1,min2;int max1,max2;max_min(a,0,N-1,&min1,&min2,&max1,&max2);printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,max1,max2); return 0;}void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2){int lmin1,lmin2,lmax1,lmax2;int rmin1,rmin2,rmax1,rmax2;int mid;if(m==n){*min1=*min2=*max1=*max2=a[m];}elseif(m==n-1){if(a[m]<a[n]){*min1=a[m];*min2=a[n];*max1=a[n];*max2=a[m];}else{*min1=a[n];*min2=a[m];*max1=a[m];*max2=a[n];}}else{mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);if(lmin1<rmin1){if(lmin2<rmin1){*min1=lmin1;*min2=lmin2;}else{*min1=lmin1;*min2=rmin1;}}elseif(rmin2<lmin1) {*min1=rmin1; *min2=rmin2; }else{*min1=rmin1; *min2=lmin1; }if(lmax1>rmax1){if(lmax2>rmax1) {*max1=lmax1;*max2=lmax2;}else{*max1=lmax1;*max2=rmax1;}}elseif(rmax2>lmax1) {*max1=rmax1; *max2=rmax2; }else{*max1=rmax1; *max2=lmax1; }}}10.#include<stdio.h>int add(int *a,int flag,int right);int main(void){int a[10]={1,2,3,4,5,6,7,8,9,10};int sum=add(a,0,9);printf("%d\n",sum);return 0;}int add(int *a,int flag,int right){int mid;if(flag==right){return a[flag];}elseif(flag==right-1){return a[flag]+a[right];}else{mid=(flag+right)/2;return add(a,flag,mid)+add(a,mid+1,right); }}11.#include<stdio.h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;int sum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){if(a[i][j]>max){max=a[i][j];n=j;}}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12.#include<stdio.h>#include<stdlib.h>#define N 4void matrix_mul(int *mul1,int*mul2,int *mul3,int length);void matrix_add_sub(int * A,int * B,int * C,int m,char ch);void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};intmul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};intmul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++) { printf("]",mul3[ i]); if((i+1)%N==0) printf("\n"); }return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch){ inti; for(i=0;i<m*m;i++) { if(ch=='+') C[i]=A[i]+B[i]; else C[i]= A[i]-B[i]; }}void update_half_value(int * A,int * B,int m){ inti,j; for(i=0;i<m/2;i++) { for(j=0;j<m/2;j++) { B[i*m+j]=A[i*m/2+j]; } }}void get_half_value(int * A,int * B,int m){ inti,j; for(i=0;i<m/2;i++) { for(j=0;j<m/2;j++) { A[i*m/2+j]=B[i*m+j]; } }}void matrix_mul(int *A,int *B,int *C,int m){if(m==2) { intD,E,F,G,H,I,J; D=A[0]*(B[1]-B[3]); E=A[3]*(B[2]-B[0]); F=(A[2]+A[3])*B[0]; G=(A[0]+A[1])*B[3]; H=(A[2]-A[0])*(B[0]+B[1]); I=(A[1]-A[3])*(B[2]+B[3]); J=(A[0]+A[3])*(B[0]+B[3]); C[0]=E+I+J-G; C[1]=D+G; C[2]=E+F; C[3]=D+H+J-F; return ; }else { intA1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4]; intB1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4]; intC1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4]; intD[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4]; int temp1[m*m/4],temp2[m*m/4]; get_half_value(A1,&A[0],m); get_half_value(A2, &A[m/2],m); get_half_value(A3,&A[m*m/2],m); get_half_value(A4,&A[m*m/2 +m/2],m); get_half_value(B1,&B[0],m); get_half_value(B2,&B[m/2],m); get_ half_value(B3,&B[m*m/2],m); get_half_value(B4,&B[m*m/2+m/2],m); matrix_a dd_sub(B2,B4,temp1,m/2,'-'); matrix_mul(A1,temp1,D,m/2); matrix_add_sub(B3,B1,temp1,m/2,'-'); matrix_mul(A4,temp1,E,m/2); matrix_add_sub(A3,A4,temp1,m/2,'+'); matri x_mul(temp1,B1,F,m/2); matrix_add_sub(A1,A2,temp1,m/2,'+'); matrix_mul(temp1,B4,G,m/2); matrix_add_sub(A3,A1,temp1,m/2,'-'); matrix_add_sub(B1,B2,temp2,m/2,'+'); matrix_mul(temp1,temp2,H,m/2); m atrix_add_sub(A2,A4,temp1,m/2,'-'); matrix_add_sub(B3,B4,temp2,m/2,'+'); matrix_mul(temp1,temp2,I,m/2); ma trix_add_sub(A1,A4,temp1,m/2,'+'); matrix_add_sub(B1,B4,temp2,m/2,'+'); matri x_mul(temp1,temp2,J,m/2); matrix_add_sub(E,I,temp1,m/2,'+'); matrix_add_sub(J ,G,temp2,m/2,'-'); matrix_add_sub(temp1,temp2,C1,m/2,'+'); matrix_add_sub(D,G,C2,m/2,'+'); matrix_add_sub(E,F,C3,m/2,'+'); matrix_add_sub(D,H,temp1,m/2,'+'); matrix_add _sub(J,F,temp2,m/2,'-'); matrix_add_sub(temp1,temp2,C4,m/2,'+'); update_half_value(C1,&C[0],m); update_half_value(C2,&C[m/2],m); update_half_value(C3,&C[m*m/2],m); updat e_half_value(C4,&C[m*m/2+m/2],m); return ; }}13.#include<stdio.h>intmain(void){int a[6][7]={ {16,4,3,12,6,0,3}, {4,-5,6,7,0,0,2}, {6,0,-1,-2,3,6,8}, {5,3,4,0,0,-2,7}, {-1,7,4,0,7,-5,6}, {0,-1,3,4,12,4,2}};intb[6][7],c[6][7];int i,j,k;int max;int flag;inttemp;for(i=0;i<6;i++) for(j=0;j<7;j++) {b[i][j]=a[i][j];c[i][j]=-1; }for(i=1;i<5;i++) { for(j=0;j<7;j++){ max=0; for(k=j-2;k<=j+2;k++) { if(k<0) continue; else if(k>6) break; else { if(b[i][j ]+b[i-1][k]>max) { max=b[i][j]+b[i-1][k]; flag=k; } } } b[i][j]=max; c[i][j]=flag;} }for(j=1;j<=5;j++) { max=0; for(k=j-2;k<=j+2;k++){ if(k<0) continue; else if(k>6) break; else { if(b[i][j]+ b[i-1][k]>max) { max=b[i][j]+b[i-1][k]; flag=k; } }} b[i][j]=max; c[i][j]=flag; }max=0;for(j=1;j<=5;j++) { if(b[i][j]>max){ max=b[i][j]; flag=j;} }printf("%d\n",max);temp=c[i][flag];pri ntf("]",a[i][temp]);for(j=i;j>0;j--) { temp=c[j][temp]; printf("]",a[j-1][temp]); }printf("\n");return 0;}14.#include<stdio.h>int main(void){intA[6]={0,3,7,9,12,13};int B[6]={0,5,10,11,11,11};int C[6]={0,4,6,11,12,12};intAB[6][6];int temp[6];int abc[6];int max;int flag;inti,j,k;for(i=0;i<=5;i++) { max=0; for(j=0;j<=i;j++){ AB[i][j]=A[i-j]+B[j]; if(AB[i][j]>max) max=AB[i][j];} temp[i]=max; }max=0;for(i=0;i<=5;i ++) { abc[i]=temp[i]+C[5-i]; if(abc[i]>max){ max=abc[i]; flag=i;} }printf("max=%d\n",max);printf("c=%d \n",5-flag);max=max-C[5-flag];for(i=0;i<=flag;i++) { if(AB[flag][i]==max){ printf("b=%d\n",i); printf("a= %d\n",flag-i); break;} }return 0;}16.#include<stdio.h>#define N 100int search(int*a,int left,int right);int sum_buf(int *a,int left,int right);int main(void){int a[N];int i;int s;for(i=0;i<N;i++) a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right){int i;intsum=0;for(i=left;i<=right;i++) sum+=a[i];return sum;}int search(int *a,int left,int right){int mid=(left+right)/2;if(left==right-1) { if(a[left]<a[right])returnright; elsereturn left; }if(mid*2!=(right+left-1)) { if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)){ return search(a,left,mid-1);} elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)) { returnsearch(a,mid+1,right); }else returnmid; }else { if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right))returnsearch(a,left,mid); elsereturn search(a,mid+1,right); }}17.#include<stdio.h>int job[6][2]={{3,8},{12,10},{5,9},{2,6},{9.3},{11,1}};intx[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);intmain(void){inti,j;bestf=32767;for(i=0;i<6;i++) x[i]=i;try(0);for(i=0;i<6;i++) printf("%d",bestx[i]);printf("\nbestf=%d\n",bestf);return 0;}void try(int i){intj;if(i==6) { for(j=0;j<6;j++)bestx[j]=x[j]; bestf=f2[i]; }else { for(j=i;j<6;j ++){ f1=f1+job[x[j]][0]; if(f2[i]>f1) f2[i+1]=f2[i]+job[x[j]][1]; else f2[i+1]=f1 +job[x[j]][1]; if(f2[i+1]<bestf) { swap(i,j); try(i+1); swap(i,j); } f1=f1 -job[x[j]][0];} }}void swap(int i,int j){inttemp;temp=x[i];x[i]=x[j];x[j]=temp;}18.#include<stdio.h>#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<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i<=M;i++){a[i]=1;}for(;i<N;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){min=sum;for(i=0;i<M+1;i++) {c[i]=atoi(b[i]);}}}else{for(j=t;j<N;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<M+1;i++)for(j=0;j<N;j++)b[i][j]='Q';i=0;j=0;h=0;k=0;for(j=0;j<N;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<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){int i;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19.#include<stdio.h>int main(void){int buf[100];int m,n;inti,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++) { buf[i+1]=buf[i];。
算法设计与分析第二版课后习题解答
算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求//输入:一个正整数n 2//输出:。
step1:a=1;step2:若a*a<n 转step 3,否则输出a;step3:a=a+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。
b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
a. gcd(31415, 14142) = gcd(14142, 3131) = gcd(3131, 1618) =gcd(1618, 1513) = gcd(1513, 105) = gcd(1513, 105) = gcd(105, 43) =gcd(43, 19) = gcd(19, 5) = gcd(5, 4) = gcd(4, 1) = gcd(1,0) = 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和2·14142之间,所以欧几里德算法比此算法快1·14142/11 ≈1300 与2·14142/11 ≈2600 倍之间。
6.证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
算法分析与设计(答案)
算法分析与设计(答案)一:二分查找的递归实现算法import java.util.Arrays;import java.util.Scanner;public class BinSearch {public static int binsearch(int[]a,int start,int stop,int b){if(start>stop)return -1;int i=(start+stop)/2;if(a[i]==b)return i;if(a[i]>b)return binsearch(a,start,i-1,b);return binsearch(a,i+1,stop,b);}/***@param args*/public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);int n=sc.nextInt();int a[]=new int [n];System.out.println("输入数组元素");for(int i=0;i<n;i++){a[i]=sc.nextInt();}Arrays.sort(a);System.out.println("排序后的数组为");for(int i=0;i<a.length;i++){System.out.print(a[i]+" ");}System.out.println();System.out.println("输入要查找的数");int b=sc.nextInt();int x=binsearch(a,0,n-1,b);if(x==-1){System.out.println(b+"不在数组中,请输入另一个数");b=sc.nextInt();x=binsearch(a,0,n-1,b);}System.out.println(b+"在数组中的第"+(x+1)+"个位置");}}二:Ackerman函数的递归实现算法import java.util.Scanner;public class Test2 {private static int akm(int n, int m) {// 递归设计int r, g;if (n == 1 && m == 0)r = 2;else if (n == 0 && m >= 0)r = 1;else if (m == 1)r = n * 2;else if (m == 2)r = (int) Math.pow(2, n);else if (m == 0 && n >= 2)r = n + 2;else {g = akm(n-1, m);r = akm(g, m-1);// 两次连着递归}return r;}public static void main(String[] args) {try {System.out.println("请输入1个大于等于0的整数:");Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println("请再输入1个大于等于0的整数:");int m = sc.nextInt();System.out.println(akm(n, m));} catch (Exception e) {}}}三:全排列的递归实现算法import java.util.Scanner;public class AllSort{//全排列public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("输入需要全排列的元素个数");int n=(char) sc.nextInt();int buf[]=new int [n];System.out.println("请依次输入每一个元素");for(int i=0;i<n;i++){buf[i]=sc.nextInt();}perm(buf,0,buf.length-1);}public static void perm(int[] buf,int start,int end){ if(start==end){//当只要求对数组中一个元素进行全排列时,只要就按该数组输出即可(特殊情况)for(int i=0;i<=end;i++){System.out.print(buf[i]);}System.out.println();}else{//多个字母全排列(普遍情况)for(int i=start;i<=end;i++){//(让指针start分别指向每一个数)int temp=buf[start];//交换数组第一个元素与后续的元素buf[start]=buf[i];buf[i]=temp;perm(buf,start+1,end);//后续元素递归全排列temp=buf[start];//将交换后的数组还原buf[start]=buf[i];buf[i]=temp;}}}}四:快速排序的递归实现算法import java.util.Scanner;public class QuickSort {public static int []a;public static void quicksort(int p,int r){if(p<r){int q=partition(p,r);quicksort(p,q-1);quicksort(q+1,r);}}public static int partition(int p,int r){int i=p,j=r+1;int x=a[p];while(true){while(a[++i]<x&&i<r);while(a[--j]>x);if(i>=j)break;int temp=a[i];a[i]=a[j];a[j]=temp;}a[p]=a[j];a[j]=x;return j;}/***@param args*/public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);System.out.println("输入要排序的数组长度");int n=sc.nextInt();a=new int[n];System.out.println("输入"+n+"个元素");for(int i=0;i<n;i++)a[i]=sc.nextInt();quicksort(0,n-1);System.out.println("排序后的数组为");for(int j=0;j<a.length;j++)System.out.print(a[j]+" ");}}五:整数划分的递归实现算法import java.io.IOException;import java.util.*;public class ZhengshuHuafen {public static int a=0 ;public static int Devide(int input, int base, int []pData, int index){if(input<1||base<1)return 0;if(input==1||base==1){if(input==1){pData[index] = input;print(pData, index+1);}else{for(int k=0; k<input; k++){pData[index++] = base;}print(pData,index);}return 1;}if(input==base){pData[index] = base;print(pData,index+1);int temp = Devide(input,base-1,pData,index);return 1 + temp;}if(input<base){int temp = Devide(input,input,pData,index);return temp;}else{pData[index] = base;int temp1 = Devide(input-base,base,pData,index+1); int temp2 = Devide(input,base-1,pData,index);return temp1 + temp2;}}public static void print(int []pData ,int index){String s = new String();for(int i = 0 ; i < index - 1 ; i++){System.out.print(pData[i]+"+");s += String.valueOf(pData[i]);s += "+"; }System.out.println(pData[index-1]);s += String.valueOf(pData[index-1]) +"\r\n";}public static void main(String[] args) {int n ;Scanner in = new Scanner(System.in) ;System.out.print("请输入一个整数") ;n = in.nextInt() ;System.out.println("你刚才输入的数为"+n) ;int []pdata = new int[n] ;a=Devide(n, n, pdata, 0) ;System.out.println(""+a) ;}}六:合并排序的递归实现算法import java.util.Scanner;public class mergeSort {public static int []b;public static void mergeSort1(int []a,int left,int right) {if(left<right){int i=(left+right)/2;mergeSort1(a,left,i);mergeSort1(a,i+1,right);merge(a,b,left,i,right);copy(a,b,left,right);}}public static void merge(int []c,int []d,int l,int m,int r) {int i=l;int j=m+1;int k=l;while((i<=m)&&(j<=r))if(c[i]<=c[j])d[k++]=c[i++];else d[k++]=c[j++];if(i>m)for(int q=j;q<=r;q++)d[k++]=c[q];elsefor(int q=i;q<=m;q++)d[k++]=c[q];}public static void copy (int[]c,int[]b,int left,int right) {for(int i=left;i<=right;i++){c[i]=b[i];}}public static void main(String[]args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();b=new int[n];int []a;a=new int [n];for(int i=0;i<n;i++){a[i]=sc.nextInt();}mergeSort.mergeSort1(a,0,n-1);for(int j=0;j<=n-1;j++)System.out.print(a[j]+" ");}}。
算法设计与分析(第2版)习题答案
习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C ++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法分析与设计(习题答案)
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法设计与分析 第2版 吕国英 第三章课后习题答案
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.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");}}3.3main(){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;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;for(i=1;i<n;i++)tem[1][n-i]=tem[1][n-i+1]+1return **tem;}3.4main(){int i,j,t=0,next=1,n;printf("请输入n\n");scanf("%d",&n);printf("显示效果如下\n");for(i=1;i<=n;i++){for(j=1;j<=n-i+1;j++){if(j==1)t=next;elset=t+i+j-1;if(j==2)next=t-1;printf("%d ",t);}printf("\n");}}//思想:每一行的第二个数为next,下一行的第一个数为next-13.5main(){int n,i,j,k;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){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 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.7main(){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);printf("ack(%d,%d)=%d\n",m,n,score);}int ack(int m,int n){if(m==0)return n+1;elseif(n==0)return ack(m-1,1);elsereturn ack(m-1,ack(m,n-1));}3.8main(){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");elseprintf("The string is not Huiwen!\n");}3.11main(){int i,n,sum=0;//sum为零的个数int zero(int pro);printf("此程序用于计算1*2*3*…*n所得的数末尾有多少个零。
算法分析与设计第二版习题答案-第三章到第五章
int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-
算法设计与分析课后习题答案
5. (25%) We want to know how many students are taking both CS2210 and CS2211 this term. Let A and B be the class lists of CS2210 and CS2211. Each of A and B consists of unique student IDs of the corresponding class. To keep it simple, we assume that the two classes have the same number of students, denoted by n. 5.1 Write an algorithm in pseudocode to count the number of students who are taking both CS2210 and CS2211 this term. 5.2 Compute the worst case running time T (n) of your algorithm with respect to the class size n. 5.3 Give the best Big-Oh complexity characterization of T (n). Solution 1: 5.1 Algorithm countCommon(A, B, n) Input: Two integer arrays A and B with both size of n Output: Number of common elements in A and B e ← 0 //number of common elements for i ← 0 to n − 1 do for j ← 1 to n − 1 do if B [j ] = A[i] then e=e+1 break return e 5.2 The worst case occurs when there are no common elements in A and B. In such case, every element in A needs to be compared with every element in B. This algorithm involves a nested “for” loop. We analyze the inner-most “for” loop first. In each iteration of the inner “for” loop, only a number of constant c operations are performed (mainly one comparison). The number of iterations of the inner “for” loop is n. Thus, the total number of operations performed in this loop is cn. As for the outer (or first) “for” loop, the number of iterations is again n. In each iteration of the outer “for” loop, it performs the work of the inner loop. Therefore, the total work done by the outer “for” loop is n × cn = cn2 . Consequently T (n) = cn2 + c′ where c′ is the number of operations for initializing e and returning e at the end. 5.3 T (n) = cn2 + c′ is O (n2 ). (Proof is straightforward.)
算法设计与分析书后参考答案
参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
《算法设计与分析基础(第3版)》第一,二章部分习题答案
作业一学号:_____ 姓名:_____说明:1、正文用宋体小四号,1.5倍行距。
2、报告中的图片、表格中的文字均用宋体五号,单倍行距。
3、图片、表格均需要有图片编号和标题,均用宋体五号加粗。
4、参考文献用宋体、五号、单倍行距,请参照参考文献格式国家标准(GB/T 7714-2005)。
5、公式请使用公式编辑器。
P144.用伪代码写一个算法来求方程ax2+bx+c=0的实根,a,b,c 是任意实系数。
(可以假设sqrt(x)是求平方根的函数。
)算法:Equate(a,b,c)//实现二元一次方程求解实数根//输入:任意系数a,b,c//输出:方程的实数根x1,x2或无解If a≠0p←b2−4acIf p>0x1←−b+sqrt(p)2ax2←−b−sqrt(p)2areturn x1,x2else if p=0return −b2aelsereturn “no real roots”elseif b≠0return −cbelseif c≠0return “no real numbers”elsereturn “no real roots”5.写出将十进制正整数转换为二进制整数的标准算法。
a.用文字描述。
b.用伪代码描述。
a.解:输入:一个正整数n输出:正整数n相应的二进制数第一步:用n 除以2,余数赋给K[i](i=0,1,2...),商赋给n第二步:如果n=0 ,则到第三步,否则重复第一步第三步:将K[i]按照i从高到低的顺序输出b.解:算法:DecToBin(n)//实现正整数十进制转二进制//输入:一个正整数n//输出:正整数n对应的二进制数组K[0..i]i ←1while n≠0 doK[i]←n%2n←(int)n/2i ++while i≠0doprint K[i]i - -p462.请用O,Ω 和θ的非正式定义来判断下列断言是真还是假。
a. n(n+1)/2∈O(n3)b. n(n+1)/2∈O(n2)c. n(n+1)/2∈θ(n3)d. n(n+1)/2∈Ω(n)解:断言为真:a,b,d断言为假:cP535.考虑下面的算法。
算法设计技巧与分析答案
算法设计技巧与分析参考答案第1章算法分析基本概念 1.1 (a)6 (b)5 (c)6 (d)6 1.4 算法执行了7+6+5+4+3+2+1=28次比较 45 33 24 45 12 12 24 12 12 33 24 45 45 12 24 12 12 12 24 45 45 33 24 12 12 12 12 45 45 33 24 24 12 24 12 12 45 33 45 24 12 12 12 24 24 33 45 45 12 12 12 24 24 33 45 45 12 12 12 24 24 33 45 45 1.5 (a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。
(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是,元素已按非升序排列的时候达到最小值。
2 1.7 4 3 12 5 6 7 2 9 1次 3 4 1次 3 4 12 2次 3 4 5 123 4 5 6 12 2次 7 12 3 4 5 6 2次 2 3 4 5 6 7 12 6次 7 9 23 4 5 6 12 2次由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。
1.11 比较9次 2 4 5 7 8 11 12 13 15 17 19 比较为6次 2 4 5 8 11 13 17 19 7 12 15 比较为3次,2 5 17 19 4 8 11 13 7 12 15 2次,1次 2 17 5 19 11 134 8 12 15 7比较均为1次,共5次 2 17 19 5 13 11 4 8 15 12 7 由上图可以得出比较次数为5+6+6+9=26次。
1.13 FTF,TTT,FTF,TFF,FTF 1.16 (a)执行该算法,元素比较的最少次数是n-1。
元素已按非降序排列时候达到最小值。
(b) 执行该算法,元素比较的最多次数是。
《算法设计与分析实用教程》习题参考解答
《算法设计与分析实用教程》习题参考解答《算法设计与分析实用教程》参考解答1-1 加减得1的数学游戏西西很喜欢数字游戏,今天他看到两个数,就想能否通过简单的加减,使最终答案等于1。
而他又比较厌烦计算,所以他还想知道最少经过多少次才能得到1。
例如,给出16,9:16-9+16-9+16-9-9-9+16-9-9=1,需要做10次加减法计算。
设计算法,输入两个不同的正整数,输出得到1的最少计算次数。
(如果无法得到1,则输出-1)。
(1)若输入两个不同的正整数a,b均为偶数,显然不可能得到1。
设x*a与y*b之差为“1”或“-1”,则对于正整数a,b经n=x+y-1次加减可得到1。
为了求n的最小值,令n从1开始递增,x在1——n中取值,y=n+1-x:检测d=x*a+y*b,若d=1或-1,则n=x+y-1为所求的最少次数。
(2)算法描述// 两数若干次加减结果为1的数学游戏#includevoid main(){long a,b,d,n,x,y;printf(" 请输入整数a,b: ");scanf("%ld,%ld",&a,&b);if(a%2==0 && b%2==0){ printf(" -1\n");return;}n=0;while(1){ n++;for(x=1;x<=n;x++){ y=n+1-x;d=x*a-y*b;if(d==1 || d==-1) // 满足加减结果为1{ printf(" n=%ld\n",n);return;}}}}请输入整数a,b: 2012,19961请输入整数a,b: 101,20136061-2 埃及分数式算法描述分母为整数分子为“1”的分数称埃及分数,试把真分数a/b 分解为若干个分母不为b 的埃及分数之和。
(1)寻找并输出小于a/b 的最大埃及分数1/c ;(2)若c>900000000,则退出;(3)若c ≤900000000,把差a/b-1/c 整理为分数a/b ,若a/b 为埃及分数,则输出后结束。
算法设计与分析(第2版)-王红梅-胡明-习题答案(1)
算法设计与分析(第2版)-王红梅-胡明-习题答案习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n图1.7 七桥问题2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计技巧与分析习题答案
算法设计技巧与分析习题答案算法设计技巧与分析习题答案【篇一:算法设计与分析考试题及答案】一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。
2.算法的复杂性有_____________和___________之分,衡量一个算法好坏的标准是______________________。
3.某一问题可用动态规划算法求解的显著特征是____________________________________。
4.若序列x={b,c,a,d,b,c,d},y={a,c,b,a,b,d,c,d},请给出序列x和y的一个最长公共子序列_____________________________。
5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。
6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。
7.以深度优先方式系统搜索问题解的算法称为_____________。
8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。
9.动态规划算法的两个基本要素是___________和___________。
10.二分搜索算法是利用_______________实现的算法。
二、综合题(50分)1.写出设计动态规划算法的主要步骤。
2.流水作业调度问题的johnson算法的思想。
3.若n=4,在机器m1和m2上加工作业i所需的时间分别为ai和bi,且(a1,a2,a3,a4)=(4,5,12,10),(b1,b2,b3,b4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。
4.使用回溯法解0/1背包问题:n=3,c=9,v={6,10,3},w={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。
算法设计与分析第三章课后答案吕国英主编
.2、#include<stdio.h>void main(){int a[6][6],b[6],i,j;printf("请输入6个整数:");for(i=0;i<6;i++){scanf("%d",&b[i]);}for(i=0;i<6;i++){a[0][i]=b[i];}for(i=1;i<=5;i++)a[i][0]=b[6-i];for(i=1;i<=5;i++)for(j=1;j<=5;j++){a[i][j]=a[i-1][j-1];}for(i=0;i<=5;i++){for(j=0;j<=5;j++).printf("%d ",a[i][j]);printf("\n");}}3、#include<stdio.h>void main(){int i,j,count,n;int a[100][100];printf("请输入矩阵的阶n=");scanf("%d",&n);count=1;for(i=1;i<=n/2;i++){for(j=i;j<=n-i+1;j++)//上侧{a[i][j]=count;count++;}for(j=i+1;j<=n-i;j++)//右侧{a[j][n-i+1]=count;.count++;}for(j=n-i+1;j>=i+1;j--)//下侧{a[n-i+1][j]=count;count++;}for(j=n-i+1;j>=i+1;j--)//左侧{a[j][i]=count;count++;}}if(n%2==1){i=(n+1)/2;a[i][i]=n*n;}for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%2d ",a[i][j]);.printf("\n");}}4、#include<stdio.h>void main(){int i,j,n,a[100][100],count=1;printf("请输入方阵的阶n:");scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=i;j++){a[i-j+1][j]=count;count++;}for(i=1;i<=n;i++){for(j=1;j<=n-i+1;j++)printf("%4d",a[i][j]);printf("\n");}}.5、#include<stdio.h>void main(){int i,j,count,n;int a[100][100];printf("请输入矩阵的阶n=");scanf("%d",&n);count=1;for(i=1;i<=n/2;i++){for(j=i;j<=n-i+1;j++)//上侧{a[i][j]=count;}for(j=i+1;j<=n-i;j++)//右侧{a[j][n-i+1]=count;}for(j=n-i+1;j>=i+1;j--)//下侧{a[n-i+1][j]=count;}for(j=n-i+1;j>=i+1;j--)//左侧{a[j][i]=count;}count++;}if(n%2==1){i=(n+1)/2;a[i][i]=i;}for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%2d ",a[i][j]);printf("\n");}}10、狼找兔子问题:一座山周围有n个洞,顺时针编号为0,1,2.,…,n-1。
算法设计与分析_青岛大学中国大学mooc课后章节答案期末考试题库2023年
算法设计与分析_青岛大学中国大学mooc课后章节答案期末考试题库2023年1.如下哪种表示不是归并排序算法时间复杂性答案:o(nlogn)2.最优子结构性质是答案:问题的最优解可通过性质相同的子问题的最优解合并而成3.有一算法的时间复杂性递归定义: T(n)=8T(n/2)+nlogn if n>1, T(1)=1; 问T(n)=?答案:4.哈夫曼编码树算法中用优先队列(堆)存储生成的结点,n个字符的哈夫曼编码树算法时间复杂性为答案:5.下列哪些问题不能用贪心算法求最优解答案:最优二叉搜素树6.在下列算法中,可求解n皇后问题的算法是答案:拉斯维加斯算法7.回溯法和分支限界法的主要区别是答案:搜素方式不同求解目标不同8.P问题、NP问题、NPC问题,下列哪些解释是正确的?P问题是确定性算法多项式时间复杂性解决的可判定问题PÍNP9.快速排序算法,其时间复杂性是,而其平均时间复杂性是,下面哪些方法可以改善快速排序算法的性能?答案:洗牌算法舍伍德算法10.下面哪些算法是解决单源最短路径问题的有效算法?答案:贪心算法优先队列分支限界法11.爬楼梯问题:有一楼梯共n级台阶,有一小朋友一次可以迈1,2或3级台阶,求共有多少不同的走法走完这n级台阶。
回答该问题最适合使用哪种算法?动态规划12.给定n个任务接受同一台机器加工, 任务i有服务时间和要求截止时间(ti,di), 找出最小延迟方案,即所有任务延迟时间最大值的最小化问题。
如3个任务 1、2、3,服务时间和截至时间为(2,4)(1,2)( 7,7),如按照1-2-3顺序安排,各任务的延迟为0,1,3,延迟的最大值为3。
使用贪心算法,如下哪种贪心策略可得到最优解?答案:以截止时间di从小到大安排13.有n个正整数组成的数组a,两端的数不能删除,中间每删除一个数,其得分为其本身同其两侧的数的乘积,求其中间n-2个数逐个删除后的最大得分。
设m[i][j] 为从a[i]到a[j]的子数组,将中间数全部删除后的最大得分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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):");
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;
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;
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;
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++)
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);
{
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;
}
}
3.3
main()
{
int n;
int **up(int **array);
scanf("%d",&n);
inቤተ መጻሕፍቲ ባይዱ 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;
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<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 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));
{
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能被两个数整除,它是%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)
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);
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");
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(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")