算法设计与分析第三章课后答案吕国英主编

合集下载

算法设计与分析——输油管道问题实验报告

算法设计与分析——输油管道问题实验报告

题目: 输油管道问题学号0091313000913133学生姓名张一楠朱玉婷专业(班级)09计本1班设计题目输油管道问题设计技术参数系统平台:windows 7开发工具:Microsoft Visual C++ 6.0设计要求1.掌握问题分析的方法与步骤,选择合适的方法解决问题。

2.选择合适的算法编写程序。

工作计划1:熟悉题目并理解,及找寻相关资料。

2:根据题目设计并分析算法。

3:使用Visual C++实现。

4:完成设计报告参考资料吕国英.《算法设计与分析》.北京:清华大学出版社,2009摘要本实验,我们通过综合应用算法解决了实际生活中的输油管道问题,通过比较各种算法的时间复杂度以及解决效率,采用了算法中以分治法为基础的随机划分来解决问题,利用随机选择方法找到各个油井的中位数,通过讨论论证了中位数即最优管道位置。

信息奥赛中一个问题有多个算法解决,通过比较不同算法解决问题的效率,选择最高效的一个。

在输油管道问题这个实验中得到运用。

关键词:算法设计,分治法,随机划分,随机选择,中位数目录1 需求分析.............................................................................. 错误!未定义书签。

1.1 实验内容.................................................................... 错误!未定义书签。

1.2 系统的基本逻辑模型 ....................................................... 错误!未定义书签。

1.3 确定目标系统的功能 (5)2 总体设计............................................................................. 错误!未定义书签。

算法分析与设计第二版习题答案-第三章到第五章

算法分析与设计第二版习题答案-第三章到第五章

算法设计与分析(第二版)习题答案主编:吕国英算法设计与分析(第二版)习题答案(第三章)第三章: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];。

算法设计与分析智慧树知到课后章节答案2023年下山东交通学院

算法设计与分析智慧树知到课后章节答案2023年下山东交通学院

算法设计与分析智慧树知到课后章节答案2023年下山东交通学院山东交通学院第一章测试1.解决一个问题通常有多种方法。

若说一个算法“有效”是指( )A:这个算法能在一定的时间和空间资源限制内将问题解决B:这个算法能在人的反应时间内将问题解决C:这个算法比其他已知算法都更快地将问题解决D:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)答案:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)2.农夫带着狼、羊、白菜从河的左岸到河的右岸,农夫每次只能带一样东西过河,而且,没有农夫看管,狼会吃羊,羊会吃白菜。

请问农夫能不能过去?()A:不一定B:不能过去 C:能过去答案:能过去3.下述()不是是算法的描述方式。

A:自然语言 B:E-R图 C:程序设计语言 D:伪代码答案:E-R图4.有一个国家只有6元和7元两种纸币,如果你是央行行长,你会设置()为自动取款机的取款最低限额。

A:40 B:29 C:30 D:42答案:305.算法是一系列解决问题的明确指令。

()A:对 B:错答案:对6.程序=数据结构+算法()A:对 B:错答案:对7.同一个问题可以用不同的算法解决,同一个算法也可以解决不同的问题。

()A:错 B:对答案:对8.算法中的每一条指令不需有确切的含义,对于相同的输入不一定得到相同的输出。

( )A:错 B:对答案:错9.可以用同样的方法证明算法的正确性与错误性 ( )A:错 B:对答案:错10.求解2个数的最大公约数至少有3种方法。

( )A:对 B:错答案:错11.没有好的算法,就编不出好的程序。

()A:对 B:错答案:对12.算法与程序没有关系。

( )A:错 B:对答案:错13.我将来不进行软件开发,所以学习算法没什么用。

( )A:错 B:对答案:错14.gcd(m,n)=gcd(n,m m od n)并不是对每一对正整数(m,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. 解:算法略。

智慧树知到《算法分析与设计》章节测试答案

智慧树知到《算法分析与设计》章节测试答案

智慧树知到《算法分析与设计》章节测试答案第一章1、给定一个实例,如果一个算法能得到正确解答,称这个算法解答了该问题。

A:对B:错答案: 错2、一个问题的同一实例可以有不同的表示形式A:对B:错答案: 对3、同一数学模型使用不同的数据结构会有不同的算法,有效性有很大差别。

A:对B:错答案: 对4、问题的两个要素是输入和实例。

A:对B:错答案: 错5、算法与程序的区别是()A:输入B:输出C:确定性D:有穷性答案: 有穷性6、解决问题的基本步骤是()。

(1)算法设计(2)算法实现(3)数学建模(4)算法分析(5)正确性证明A:(3)(1)(4)(5)(2)B:(3)(4)(1)(5)(2)C:(3)(1)(5)(4)(2)D:(1)(2)(3)(4)(5)答案: (3)(1)(5)(4)(2)7、下面说法关于算法与问题的说法错误的是()。

A:如果一个算法能应用于问题的任意实例,并保证得到正确解答,称这个算法解答了该问题。

B:算法是一种计算方法,对问题的每个实例计算都能得到正确答案。

C:同一问题可能有几种不同的算法,解题思路和解题速度也会显著不同。

D:证明算法不正确,需要证明对任意实例算法都不能正确处理。

答案: 证明算法不正确,需要证明对任意实例算法都不能正确处理。

8、下面关于程序和算法的说法正确的是()。

A:算法的每一步骤必须要有确切的含义,必须是清楚的、无二义的。

B:程序是算法用某种程序设计语言的具体实现。

C:程序总是在有穷步的运算后终止。

D:算法是一个过程,计算机每次求解是针对问题的一个实例求解。

答案: 算法的每一步骤必须要有确切的含义,必须是清楚的、无二义的。

,程序是算法用某种程序设计语言的具体实现。

,算法是一个过程,计算机每次求解是针对问题的一个实例求解。

9、最大独立集问题和()问题等价。

A: 最大团B:最小顶点覆盖C:区间调度问题D:稳定匹配问题答案:最大团,最小顶点覆盖10、给定两张喜欢列表,稳定匹配问题的输出是()。

算法分析与设计第3章课后习题答案

算法分析与设计第3章课后习题答案

第3章作业解答设有4个矩阵连乘积ABCD ,设它们的维数分别为A:45×8,B:8×40,C:40×25,D:25×10,请求出它们的最优计算次序及对应的最少计算量。

解:设A 1=A, A 2=B, A 3=C, A 4=Dp 0=45,p 1=8,p 2=40,p 3=25,p 4=10 ,用两个二维数组m 和s 记录中间结果,其中,m[i][j]记录矩阵连乘积A[i:j]的最少计算量,s[i][j]记录A[i:j]的最优断开位置。

由动态规划思想,得递归式为:⎪⎩⎪⎨⎧<+++==-<≤j i p p p j k m k i m j i j i m j k i }],1[],[{min 0],[1jk i 其中,k 的取值有j-i 种可能:i,i+1,...,j-1. 计算过程如下: (1) m[i][i]=0, i=1,2,3,4 (2) 求m[i][i+1], i=1,2,3m[1][2]= p 0×p 1×p 2=45×8×40=14400 s[1][2]=1 m[2][3]= p 1×p 2×p 3=8×40×25=8000 s[2][3]=2 m[3][4]= p 2×p 3×p 4=40×25×10=10000 s[3][4]=3 (3) 求m[i][i+2], i=1,2m[1][3]=min{m[1][1]+m[2][3]+p 0×p 1×p 3, m[1][2]+m[3][3]+p 0×p 2×p 3 } =min{8000+45×8×25,14400+45×40×25} =min{17000, 59400} =17000 s[1][3]=1m[2][4]=min{m[2][2]+m[3][4]+p1×p2×p4, m[2][3]+m[4][4]+p1×p3×p4 }=min{10000+8×40×10,8000+8×25×10}=min{13200, 10000} =10000s[2][4]=3(4) 求m[i][i+3], i=1m[1][4]=min{m[1][1]+m[2][4]+p0×p1×p4 ,m[1][2]+m[3][4]+p0×p2×p4 ,m[1][3]+m[4][4]+p0×p3×p4 }=min{10000+45×8×10, 14400+10000+45×40×10, 17000+45×25×10 }=min{13600, 42400, 28250} =13600s[1][4]=1根据以上结果可得数组m, s如下:m[1][4]即A[1:4]的最少计算量,也即ABCD连乘积的最少计算量为13600。

算法设计与分析 第2版 吕国英 第三章课后习题答案

算法设计与分析 第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所得的数末尾有多少个零。

算法设计与分析课后答案

算法设计与分析课后答案

5..证明等式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)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)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//输出:实根或者无解信息D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //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.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。

算法分析与设计第二版习题答案-第三章到第五章

算法分析与设计第二版习题答案-第三章到第五章
{
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-

算法设计与分析书后参考答案

算法设计与分析书后参考答案

参考答案第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)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。

【精选】贪心算法的应用

【精选】贪心算法的应用

贪心算法的应用课程名称:算法设计与分析院系:计算机科学与信息工程学院学生姓名:****学号:**********专业班级:********************************** 指导教师:******201312-27贪心算法的应用摘要:顾名思义,贪心算法总是作出在当前看来最好的选择。

也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

贪心算法求问题一般具有两个重要性质:贪心选择性质和最优子结构性质。

所谓贪心选择性是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择达到。

这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法主要区别。

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

背包问题是一个经典的问题,我们可以采用多种算法去求解0/1背包问题,比如动态规划法、分支限界法、贪心算法、回溯法。

在这里我们采用贪心法解决这个问题。

关键词:贪心法背包问题最优化目录第1章绪论 (3)1.1 贪心算法的背景知识 (3)1.2 贪心算法的前景意义 (3)第2章贪心算法的理论知识 (4)2.1 问题的模式 (4)2.2 贪心算法的一般性描述 (4)第3章背包问题 (5)3.1 问题描述 (5)3.2 问题分析 (5)3.3算法设计 (5)3.4 测试结果与分析 (10)第4章结论 (12)参考文献 (13)附件 (13)第1章绪论1.1 贪心算法的背景知识贪心算法又叫登山法,它的根本思想是逐步到达山顶,即逐步得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。

《算法设计与分析实用教程》习题参考解答

《算法设计与分析实用教程》习题参考解答

《算法设计与分析实用教程》习题参考解答《算法设计与分析实用教程》参考解答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 为埃及分数,则输出后结束。

算法设计与分析智慧树知到课后章节答案2023年下天津大学

算法设计与分析智慧树知到课后章节答案2023年下天津大学

算法设计与分析智慧树知到课后章节答案2023年下天津大学天津大学第一章测试1.下列关于效率的说法正确的是()。

答案:提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法;效率是一个性能要求,其目标应该在需求分析时给出;效率主要指处理机时间和存储器容量两个方面2.算法的时间复杂度取决于()。

答案:待处理数据的初态;问题的规模3.计算机算法指的是()。

答案:解决问题的有限运算序列4.归并排序法的时间复杂度和空间复杂度分别是()。

答案:O(nlog2n);O(n)5.将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。

()答案:错6.用渐进表示法分析算法复杂度的增长趋势。

()答案:对7.算法分析的两个主要方面是时间复杂度和空间复杂度的分析。

()答案:对8.某算法所需时间由以下方程表示,求出该算法时间复杂度()。

答案:O(nlog2n)9.下列代码的时间复杂度是()。

答案:O(log2N)10.下列算法为在数组A[0,...,n-1]中找出最大值和最小值的元素,其平均比较次数为()。

答案:3n/2-3/2第二章测试1.可用Master方法求解的递归方程的形式为()。

答案:T(n)=aT(n/b)+f(n) , a≥1, b>1, 为整数, f(n)>0.2.答案:对3.假定,, 递归方程的解是. ( )答案:对4.假设数组A包含n个不同的元素,需要从数组A中找出n/2个元素,要求所找的n/2个元素的中点元素也是数组A的中点元素。

针对该问题的任何算法需要的时间复杂度的下限必为。

( )答案:错5.使用Master方法求解递归方程的解为().答案:6.考虑包含n个二维坐标点的集合S,其中n为偶数,且所有坐标点中的均不相同。

一条竖直的直线若能把S集合分成左右两部分坐标点个数相同的子集合,则称直线L为集合S的一条分界线。

若给定集合S,则可在时间内找到这条分界线L。

( )答案:对7.答案:8.从n个数中找出前k个最小的元素并对所选择的前k个最小的元素进行排序。

算法设计与分析课后习题

算法设计与分析课后习题

算法设计与分析课后习题(总8页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第一章1. 算法分析题算法分析题1-1 求下列函数的渐进表达式(1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2)(2). n^2 / 10 + 2^n当n>5是,n^2 < 2 ^n所以,当n >= 1时,n^2/10 < 2 ^n故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n)(3). 21 + 1/n < 21 + 1 = 22 = O(1)(4). log(n^3)=3log(n)=O(log(n))(5). 10log(3^n) = (10log3)n = O(n)算法分析题1-6(1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5所以:f(n)=Θ(log(n)+5) =Θ(g(n))(2)因为:log(n) < √n ; f(n) = 2log(n); g(n)= √n所以:f(n) = O(g(n))(3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n)所以;f(n) = Ω(g(n))(4)因为:f(n) = nlogn +n; g(n) = logn所以:f(n) =Ω(g(n))(5)因为: f(n) = 10; g(n) = log(10)所以:f(n) =Θ(g(n))(6)因为: f(n)=log^2(n); g(n) = log(n)所以: f(n) ==Ω(g(n))(7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2所以: f(n) = Ω(g(n))(8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n所以: f(n) = O(g(n))习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)).分析与解答:因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)).第二章算法分析题2-3 设a[0:n-1]是已经排好序的数组。

算法设计与分析第三章课后答案吕国英主编

算法设计与分析第三章课后答案吕国英主编

.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。

算法设计与分析第三章

算法设计与分析第三章

第三章作业答案3.void GetNext(char T[ ], int next[ ]){next[1]=0;next[2]=1;j=T[0],k=0;for(;j>2;j--){for(n=j-2;n>=1;n--){//n为要比较的前缀的最后一个字符的下标m=j-n;//m为要比较的后缀的第一个字符的下标for(i=1;i<=n;i++){if(T[i]!=T[m+i-1])break;}if(i==n+1){next[j]=n+1;break;}}if(n==0)next[j]=1;}}4.解:BF算法:第一趟 a b a b c a b c c a b c c a c b a ba b c第二趟 a b a b c a b c c a b c c a c b a b a第三趟 a b a b c a b c c a b c c a c b a ba b c c第四趟 a b a b c a b c c a b c c a c b a ba第五趟 a b a b c a b c c a b c c a c b a ba第六趟 a b a b c a b c c a b c c a c b a ba b c c a c第七趟 a b a b c a b c c a b c c a c b a ba第八趟 a b a b c a b c c a b c c a c b a b第九趟 a b a b c a b c c a b c c a c b a ba第十趟 a b a b c a b c c a b c c a c b a ba b c c a c由此可知,用BF算法一共要进行3+1+4+1+1+6+1+1+1+6=25次比较方能匹配出KMP算法:next[]={,0,1,1,1,1,2};第一趟 a b a b c a b c c a b c c a c b a ba b c第二趟 a b a b c a b c c a b c c a c b a ba b c c第三趟 a b a b c a b c c a b c c a c b a ba b c c a c第四趟 a b a b c a b c c a b c c a c b a ba b c c a由此可知,用KMP算法一共要进行3+4+6+5=18次比较方能匹配出6. 参考代码如下:排列最终存储在长度为n的阶乘,元素类型为指针的数组中,数组指向一个排列,具体的排列数据存储在数组中。

算法设计与分析-课后习题集答案

算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。

快1414倍。

程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。

(log )n O 。

(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。

3()n O 。

(3)画线语句的执行次数为。

O 。

(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。

2()n O 。

10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。

对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。

(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。

对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。

(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。

11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。

可选212c =,03n =。

对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。

(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。

可选 1c =,04n =。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

一只狼从0号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。

输入m,n,问兔子有没有幸免的机会?如果有,该藏哪里?#include <stdio.h>void main(){int a[100],b[100],i,n,m,k=0,flag=0;printf("请输入洞的个数n:");scanf("%d",&n);printf("请输入要经过洞的个数m:");scanf("%d",&m);for(i=0;i<n;i++){a[i]=0;b[i]=1;}for(i=0;;i=(i+m)%n){if(a[(i+m)%n]==0)a[(i+m)%n]=1;elseif(a[(i+m)%n]==1)break;}for(i=0;i<n;i++){if(a[i]==0)k++;elseif(a[i]==1)flag++;}if(k>0){printf("\n兔子有幸免的机会,位置为:\n");for(i=0;i<n;i++)if(a[i]==0)printf("%d ",i);printf("\n");}if(flag==n)printf("兔子没有幸免的机会!\n");}12、有52张牌,使它们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同规则翻转,以此类推,知道翻的牌超过104张为止。

统计最后有几张牌正面朝上,以及它们的位置号。

#include<stdio.h>void main(){int a[100],i,sum,k,n=0;for(i=0;i<100;i++)a[i]=1;sum=0;for(i=2;i<53;i++){k=1;while(i*k<53&&sum<=104){a[i*k]=-a[i*k];k=k+1;++sum;}}printf("正面朝上的牌的位置为\n");for(i=1;i<53;i++)if(a[i]==1){n++;printf("%d ",i);}printf("\n");printf("总共%d张牌\n",n);}13、A,B,C,D,E5人为某次竞赛的前五名,他们在公布名次前猜名次。

A说:B得第三名,C得第五名。

B说:D得第二名,E得第四名。

C说:B得第一名,E得第四名。

D说:C得第一名,B得第二名。

A说:D得第二名,A得第三名。

结果每个人都猜对了一半,实际名次是什么呢?#include <stdio.h>void main(){int a,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("五人的名次分别为:\n");printf("A\tB\tC\tD\tE\n");printf("%d\t%d\t%d\t%d\t%d\n",a,b,c,d,e);}}}14、#include<stdio.h>void main(){int i,w1,w2,w3,sql;for(i=10;i<32;i++){sql=i*i;w1=sql/100;w2=sql%100/10;w3=sql%100%10;if(w1==w2||w1==w3||w2==w3)printf("%d*%d=%d\n",i,i,sql);}}15、#include<stdio.h>void main(){int A,B,C;for(A=1;A<=3;A++)for(B=1;B<=3;B++){if(B!=A)C=6-A-B;if(C!=A&&C!=B)if(A!=1&&C!=1&&C!=3)printf("A<->%d\nB<->%d\nC<->%d\n",A,B,C);}printf("1->X 2->Y 3->Z\n");}16、#include<stdio.h>void main(){int number;printf("请输入一个整数\nnumber=");scanf("%d",&number);if(number%4==0)printf("%d能被4整除\n",number);if(number%7==0)printf("%d能被7整除\n",number);if(number%9==0)printf("%d能被9整除\n",number);elseprintf("不能被4,7,9任一个整除\n");}17、#include<stdio.h>void main(){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\n");printf("Please Input a=");scanf("%d",&a);printf("your number divided by 4 has a remainder of\n");printf("Please Input b=");scanf("%d",&b);printf("your number divided by 7 has a remainder of\n");printf("Please Input c=");scanf("%d",&c);printf("let me think a moment ...\n");d=28*a+21*b+36*c;while (d>84)d=d-84;printf("你的数字是%d\n",d);}18、#include<stdio.h>void main(){int a,b,c,d,e,f,g,h,i,sum1,sum2;for(a=1;a<=9;a++)for(b=1;b<=9;b++)if(a!=b)for(c=1;c<=9;c++)if(c!=a&&c!=b)for(d=1;d<=9;d++)if(d!=a&&d!=b&&d!=c)for(e=1;e<=9;e++)if(e!=a&&e!=b&&e!=c&&e!=d)for(f=1;f<=9;f++)if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)for(g=1;g<=9;g++)if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)for(h=1;h<=9;h++) if(h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g)for(i=1;i<=9;i++)if(i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h){ sum1=a*10000+b*1000+c*100+d*10+e;sum2=f*1000+g*100+h*10+i;if(sum1==2*sum2)printf("五位数为:%d 四位数为:%d \n",sum1,sum2);}}19、#include<stdio.h>#include<string.h>void main(){char str[100];int sum=0,i,n=0;printf("请输入十六进制数:");gets(str);n=strlen(str);for(i=0;i<n;i++){if(str[i]=='A'|str[i]=='B'|str[i]=='C'|str[i]=='D'|str[i]=='E'|str[i]=='F')str[i]=str[i]-55;if(str[i]=='a'|str[i]=='b'|str[i]=='c'|str[i]=='d'|str[i]=='e'|str[i]=='f')str[i]=str[i]-87;if(str[i]=='1'|str[i]=='2'|str[i]=='3'|str[i]=='4'|str[i]=='5'|str[i]=='6'|str[i]=='7'|str[i]=='8'|str[i]=='9'|str[i]=='0')str[i]=str[i]-48;}for(i=0;i<n-1;i++)sum=(sum+str[i])*16;sum=sum+str[i];printf("十进制数为:%d\n",sum);}20、#include<stdio.h>void main(){int a,b,c,d,e,f,g,h,i;for(a=1;a<=9;a++)for(b=1;b<=9;b++)if(a!=b)for(c=1;c<=9;c++)if(c!=a&&c!=b)for(d=1;d<=9;d++)if(d!=a&&d!=b&&d!=c)for(e=1;e<=9;e++)if(e!=a&&e!=b&&e!=c&&e!=d)for(f=1;f<=9;f++)if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)for(g=1;g<=9;g++)if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)for(h=1;h<=9;h++) if(h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g)for(i=1;i<=9;i++)if(i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h){ if((a*10+b)*(c*100+d*10+e)==(f*1000+g*100+h*10+i))printf("a=%d b=%d c=%d d=%d e=%d f=%d g=%d h=%d i=%d\n",a,b,c,d,e,f,g,h,i);}}21、#include<stdio.h>#include<math.h>void main(){int a,b,c,d,e,f,g,h,i;for(a=1;a<=9;a++)for(b=1;b<=9;b++)if(a!=b)for(c=1;c<=9;c++)if(c!=a&&c!=b)for(d=1;d<=9;d++)if(d!=a&&d!=b&&d!=c)for(e=1;e<=9;e++)if(e!=a&&e!=b&&e!=c&&e!=d)for(f=1;f<=9;f++)if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)for(g=1;g<=9;g++)if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)for(h=1;h<=9;h++) if(h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g)for(i=1;i<=9;i++)if(i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h)if(sqrt(a*100000+b*10000+c*1000+d*100+e*10+f)==(g*100+h*10+i))printf("%d\n",a*100000+b*10000+c*1000+d*100+e*10+f);}23、#include<stdio.h>void main(){int number,w1,w2,w3,w4,w5;printf("请输入一个五位以内的正整数:");scanf("%d",&number);if(number/10==0){printf("它是一个一位数!\n");printf("%d\n",number);printf("正序逆序相同!\n");}elseif(number/100==0){printf("它是一个两位数!\n");printf("正序为:%d %d\n",number/10,number%10);printf("逆序为:%d %d\n",number%10,number/10);}elseif(number/1000==0){printf("它是一个三位数!\n");w1=number/100;w2=number%100/10;w3=number%10;printf("正序为:%d %d %d\n",w1,w2,w3);printf("逆序为:%d %d %d\n",w3,w2,w1);}elseif(number/10000==0){printf("它是一个四位数!\n");w1=number/1000;w2=number%1000/100;w3=number%100/10;w4=number%100%10;printf("正序为:%d %d %d %d\n",w1,w2,w3,w4);printf("逆序为:%d %d %d %d\n",w4,w3,w2,w1);}elseif(number/100000==0){printf("它是一个五位数!\n");w1=number/10000;w2=number%10000/1000;w3=number%1000/100;w4=number%1000%100/10;w5=number%1000%100%10;printf("正序为:%d %d %d %d %d\n",w1,w2,w3,w4,w5);printf("逆序为:%d %d %d %d %d\n",w5,w4,w3,w2,w1);}elseprintf("error!");}27、#include<stdio.h>void main(){int month;printf("请输入月份month=");scanf("%d",&month);switch(month){case 1:printf("January\n");break;case 2:printf("February\n");break;case 3:printf("March\n");break;case 4:printf("April\n");break;case 5:printf("May\n");break;case 6:printf("June\n");break;case 7:printf("July\n");break;case 8:printf("August\n");break;case 9:printf("September\n");break;case 10:printf("October\n");break;case 11:printf("November\n");break;case 12:printf("December\n");break;}}。

相关文档
最新文档