题目 :
给出n个一位数字 , 可以有重复 , 对这n位数字进行排列 ,有多少种不同的组合理解 :
理解 :
设 R ={r , r ,…..,r} R为n个要全排列的元素集合
#include<stdio.h>#include<math.h>#include<stdlib.h>int divisors[100];int divisorsNum;int getNextSmall(int n){if(n==1){return 1;}else{for(int i = 0;i<divisorsNum;i++){if(divisors[i]==n){return divisors[i-1];}}}return -1;}int isPrime(int n){for(int i =2;i<=sqrt(n);i++){if((n/i)*i==n){return 0;}}return 1;}int function(int n,int m){printf("%d %d \n",n,m);// system("pause");if(m==-1){printf("出错");system("pause");}//如果n是质数 那么只有一种情况if(isPrime(n) == 1 || n ==2 ||m==1){return 1;}//n的因子不可能大于 melse if(n<m){return function(n,n);}//类似于 q(12,12) = q(12,6) +1else if(n==m){return function(n,getNextSmall(n)) + 1;}//类似于 q(12,6) = q(2,6) + q(12,4)// 包括6 不包括6else if(n>m){int nextSmall = getNextSmall(m);return function(n/m,m) + function(n,nextSmall);}}int main(){int n;while(1){printf("请输入一个数 : ");scanf("%d",&n);divisorsNum = 0;//获得所有因子for(int i =1;i<=n;i++){if(n==(n/i)*i){divisors[divisorsNum] = i;divisorsNum++;}}//获得所有组成printf("---> %d 的因式分解个数(非质数包括 [1,%d] 和 [%d,1]) : %d\n",n,n,n,function(n,n));}return 0;}
