题目 :
给出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的因子不可能大于 m
else if(n<m){
return function(n,n);
}
//类似于 q(12,12) = q(12,6) +1
else if(n==m){
return function(n,getNextSmall(n)) + 1;
}
//类似于 q(12,6) = q(2,6) + q(12,4)
// 包括6 不包括6
else 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;
}