ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:18.36KB ,
资源ID:12470487      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12470487.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析实验.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析实验.docx

1、算法设计与分析实验Integer FactorizationDescription 问题描述: 大于1 的正整数n可以分解为:n=X1*X2*Xm。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n,编程计算n共有多少种不同的分解式。Input 输入由多组测试数据组成。 每组测试数据输入第一行有1 个正整数n (1n2000000000)。Output 对应每组输入,输出计算出的不同的分解式数。Sample Input 12Sa

2、mple Output 8程序如下:#include#includestruct DP int num; int sum; d50000=0;int max=0;void qsort(int low,int high,struct DP key) int i=low,j=high; struct DP tag=keyi; if(ij) do while(tag.numkeyj.num & ij) j-; if(i=keyi.num & ij) i+; if(ij) keyj=keyi; j-; while(ij); keyi=tag; qsort(low,j-1,key); qsort(i+1

3、,high,key); int dfs(int left) int i,p; int l,r,m; int count=0; l=0; r=max; while(l1; if(dm.numleft) l=m+1; else r=m-1; p=l; if(dp.sum) return dp.sum; for(i=1;i=di.num;i+) if(left%di.num=0) count+=dfs(left/di.num); dp.sum=count; return count;int main(void) int i,j,tmp; int n; scanf(%d,&n); tmp=sqrt(n

4、); for(i=1;i=tmp;i+) if(n%i=0) dmax.num=i; max+; dmax.num=n/i; max+; max-; qsort(0,max,d); d0.sum=1; printf(%dn,dfs(n); return 0;比赛安排Description 设有2n(n=6)个球队进行单循环比赛,计划在2n 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n 1天内每个队都与不同的对手比赛。 例如n=2时的比赛安排: 队 1 2 3 4 比赛 1=2 3=4 一天 1=3 2=4 二天 1=4 2=3 三天 Input 输入由多组测试数据组成。 每

5、组测试数据输入一个正整数代表题目中的n。Output 对应每组输入,输出如样例所示。 1-2,3-4 表示第一天1队与2 队,3队与4队比赛Sample Input 2Sample Output 1-2,3-41-3,2-41-4,2-3程序如下:#includeint a8080;void copy(int n) int m,i,j; m=n/2; for(i=1;i=m;i+) for(j=1;j=m;j+) aij+m=aij+m; ai+mj=aij+m; ai+mj+m=aij; void wz(int n) if(n=1) a11=1; return ; else wz(n/2);

6、 copy(n);int main() int n,i,j,m,f,k; while(scanf(%d,&n)!=EOF) k=1; for(i=0;in;i+) k*=2; wz(k); m=0; for(j=2;j=k;j+) m+;f=1; for(i=1;i=k;i+) if(aij!=0) if(f) printf(%d-%d,m,i,aij); f=0; else printf(,%d-%d,i,aij); aaijj=0; printf(n); 又是Hanoi塔问题Description A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小

7、地叠在一起。各圆盘从小到大编号为1,2,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1):每次只能移动1个圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):任何时刻都不允许将同色圆盘叠在一起; 规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。 按照上述四种规则移动过程中,如将圆盘从A柱移到B柱,则称B柱使用一次。例如要将塔座A上2个圆盘,按上述四种规则移动到B柱,A柱使用0次,B柱使用2次,C柱使用1次。试设计一

8、个算法,统计用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上并仍按同样顺序叠置时,A柱、B柱、C柱的使用次数。 编程任务: 对于给定的正整数n,编程计算最优移动方案时,A柱、B柱、C柱的使用次数。Input 输入由多组测试数据组成。每组测试数据的第1 行是给定的正整数n。Output 对应每组输入,输出的每一行由三个相互空格的正整数组成,分别表示塔座A的使用次数、塔座B的使用次数及塔座C的使用次数。Sample Input 2Sample Output 0 2 1程序如下:#include using namespace std;class Hanoiprivate:int numA,nu

9、mB,numC;public:Hanoi();void MoveHanoi(int num,char A,char B,char C);void Caluater(char ch1,char ch2);void Display();Hanoi:Hanoi()numA=0;numB=0;numC=0;void Hanoi:Caluater(char ch1,char ch2)if(ch2=A)numA+;else if(ch2=B)numB+;elsenumC+;void Hanoi:MoveHanoi(int num, char A, char B,char C)if(num0)MoveHan

10、oi(num-1,A,C,B);Caluater(A,B);MoveHanoi(num-1,C,B,A);void Hanoi:Display()coutnumA numB numCnn)Hanoi h;h.MoveHanoi(nn,A,B,C);h.Display();return 0;Permutation with RepetitionDescription R= r1,r2, ,rn 是要进行排列的n 个元素。其中元素r1,r2, ,rn可能相同。试设计一个算法,列出R的所有不同排列。 编程任务:给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。Input 输入由多组测

11、试数据组成。每组测试数据的第1 行是元素个数n,1 = n = 500。接下来的1 行是待排列的n 个元素。 Output 对应每组输入,将计算出的n 个元素的所有不同排列输出,每种排列单独一行。最后1 行中的数是排列总数。Sample Input 4aaccSample Output aaccacacacca caac caca ccaa 6 程序如下:#include #include using namespace std ;int ans ;int ok(char str,int a ,int b ) if( b a) for(int i = a ; i b ; i+) if( str

12、i = strb ) return 0 ; return 1 ;void perm(char str,int k ,int m) int i ; if( k = m ) ans + ; for( i = 0 ;i = m ;i+ ) printf(%c,stri ) ; printf(n) ; else for( i = k ; i = m ;i+) if( ok(str,k,i) ) swap ( strk,stri ); perm(str, k+1 , m ); swap(strk,stri ) ; int main(int argc, char* argv) char str1000;

13、int n ; while( scanf(%d,&n) != EOF ) ans = 0 ; scanf(%s,str ) ; perm(str,0,n-1) ; printf(%dn,ans ); return 0;Problem C:整数划分问题Description 将正整数n表示成一系列正整数之和:n=n1+n2+nk,其中n1n2nk1,k1。 正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+

14、1+1+1。Input 输入包含n+1行; 第一行是一个整数n,表示有n个测试用例; 第2至n+1每行一个正整数。 Output 对应每组输入,输出正整数n的不同划分个数。 Sample Input 256Sample Output 711程序如下:#include int split(int n,int m);int main()int k,i;int a100 ;scanf(%d,&k);for(i=0;ik;i+) scanf(%d,&ai); for(i=0;ik;i+) printf(%dn,split(ai,ai); int split(int n,int m)if(n1)|(m1

15、) return 0;if(n=1)|(m=1) return 1;if (nm) return split(n,n);if(n=m) return split(n,m-1)+1;return split(n,m-1)+split(n-m,m);双色Hanoi塔问题Description A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1):每次只能移动1个

16、圆盘; 规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则(3):任何时刻都不允许将同色圆盘叠在一起; 规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。 试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。 编程任务: 对于给定的正整数n,编程计算最优移动方案。Input 输入由多组测试数据组成。每组测试数据的第1 行是给定的正整数n。Output 对应每组输入,输出的每一行由一个正整数k和2 个字符c1 和c2 组成,表示将第k 个圆盘从塔座c1 移到塔座c2 上。Sample Input 3Sam

17、ple Output 1 A B 2 A C 1 B C 3 A B 1 C A 2 C B 1 A B程序如下: #include int split(int n,int m);int main()int k,i;int a100 ;scanf(%d,&k);for(i=0;ik;i+) scanf(%d,&ai); for(i=0;ik;i+) printf(%dn,split(ai,ai); int split(int n,int m)if(n1)|(m1) return 0;if(n=1)|(m=1) return 1;if (nm) return split(n,n);if(n=m)

18、 return split(n,m-1)+1;return split(n,m-1)+split(n-m,m);再次hanoi塔问题Description 古老的汉诺塔问题是:用最少的步数将N个半径互不相等的圆盘从l号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面。 现在再加上一个条件:不允许直接把盘从l号柱移动到3号柱,也不允许直接把盘从3号柱移动到1号柱。 把盘按半径从小到大用1N编号。每种状态用N个整数表示,第i个整数表示i号盘所在的柱的编号。则N=2时的移动方案为 (1,1)(2,1)(3,1)(3,2)(2,2)(1,2)(1,3)(2,3)(3,3) 初始状态为

19、第O步,编程求在某步数时的状态。Input 输入的第1行为整数T(1T50000),表示输入数据的组数。接下来的丁行,每行有两个整数N,M(1N19,OM 移动N个圆盘所需的步数)。Output 输出共有T行。 对于每组输入数据,输出N个整数表示移动N个盘在M步时的状态,每两个数之间用一个空格隔开,行首和行末不要有多余的空格。Sample Input 42 02 53 03 1Sample Output 1 11 21 1 12 1 1程序如下:#include using namespace std;int f20,ans20;void Compute(int n,int m,int s,i

20、nt anx,int d) if(n=0) return; if(m=fn-1) ansn=s; Compute(n-1,m,s,anx,d); return; if(m=2*fn-1+1) ansn=anx; Compute(n-1,m-(fn-1+1),d,anx,s); return; ansn=d; Compute(n-1,m-(2*fn-1+2),s,anx,d); return;int main() int t,n,m,i; f0=0; for(i=1;i=19;i+) fi=fi-1*3+2; scanf(%d,&t); while(t-) scanf(%d%d,&n,&m); Compute(n,m,1,2,3); for(i=1;i=n;i+) printf(i=1?%d: %d,ansi); printf(n); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1