输入n,把n!=1*2*3*。。。*n的素因子相乘的形式
例:825=3*5^2*11,表示为(0 1 2 0 1)表示0,1,2,0,1个2,3,5,7,11
输入:53
输出:53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
思路:split_to_prime采用递归的方式将n进行分解,如果能被m整除,则将m与商在带入函数进行计算,知道为素数。
factorial:第一次调用split_to_prime,以及递归方式注意计算1...n。
#include <stdio.h>
#include <math.h>
#include <string.h>
int pri[100];
int prime[100];
int size;
void is_prime()
{
int ok = 1, i = 0, j = 0, m = 0;
for(i = 2; i <= 100; i++)
{
ok = 1;
m = sqrt(i);
for(j = 2; j <= m; j++)
{
if(i % j == 0)
{
ok = 0;
break;
}
}
if(ok)
{
prime[size++] = i;
}
}
}
void split_to_prime(int n)
{
int m = (int)sqrt(n);
int ok = 1;
int i = 0;
for(i = 2; i <= m; i++)
{
if(n % i == 0)
{
split_to_prime(i);
split_to_prime(n / i);
ok = 0;
break;
}
}
if(ok)
{
pri[n]++;
}
}
int factorial(int n)
{
if(1 == n)
{
return n;
}
else
{
split_to_prime(n);
factorial(--n);
}
}
void print()
{
int i = 0;
for(i = 0; i <= size; i++)
{
printf("%d ", pri[prime[i]]);
}
printf("\n");
}
int main()
{
size = 0;
int n;
scanf("%d", &n);
memset(pri, 0, sizeof(pri));
is_prime(n);
factorial(n);
print();
}