输入正整数n(2<=n<=100),把阶乘n!=1*2*3*...*n分解成素因子相乘的形式,从小到大输出各个素数(2、3、5...)的指数。例如,5! 表示为 3,1, 1个2, 3, 5。程序忽略比最大素因子更大的素数(否则末尾会有无穷多个0)。
样例输入:
5
53
样例输出:
5! = 3 1 1
53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
[分析]
样例输入:
5
53
样例输出:
5! = 3 1 1
53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
[分析]
因为a^m * a^n = a^(m+n),所以我们只需把所有素因子对应的指数累加起来 。注意,n<=100,即这些素因子不会超过100。我们首先构造一张最大素数为100的素数表,然后用阶乘的每一个数(从小到大)与每一个素数相模,并记录每一个素数的指数。用一个数组p来保存对应的各个素数的指数个数,并标记最大的那个素因子的下标为maxp,最后循环输出到最大下标即可。
int is_prime(int n)
{
for(int i = 2; i*i <= n;++i)
{
if(n % i == 0)
return 0;
}
return 1;
}
int main(void)
{
//素数表
int prime[100] = {0};
int count = 0;
//构造素数表
for(int i = 2; i <= 100; ++i)
{
if(is_prime(i))
{
prime[count++] = i;
}
}
//各个素数的指数
int p[100];
int n;
while(scanf("%d",&n) == 1)
{
int maxp = 0;
memset(p,0,sizeof(p));
for(int i = 1; i <= n; ++i)
{
int m = i;
for(int j = 0; j < count; ++j)
{
//反复除以prime[j],并累加p[j]
while(m % prime[j] == 0)
{
m /= prime[j];
p[j]++;
if(j > maxp)
maxp = j;//更新最大因子下标
}
}
}
for(int i = 0; i <= maxp; ++i)//只循环到最大下标
printf("%d ",p[i]);
printf("\n");
printf("%d! = ",n);
for(int i = 0; i <= maxp; ++i)
{
for(int j = 0; j < p[i]; ++j)
{
if(i == maxp && j ==p[i]-1)
printf("%d",prime[i]);
else
printf("%d*",prime[i]);
}
}
printf("\n");
}
}