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