输入正整数(2<=n<=100),把阶乘n!= 1 * 2 * 3 * ...* n分解成素因子相乘的形式,从小到大输出各个素数(2、3、5....)的指数。例如825 = 3 * 5^2 * 11,应表示成(0、1、2、0、1),即分别有0、1、2、0、1个2、3、5、7、11参加相乘。你的程序应该忽略比最大素因子更大的素数(否则末尾会有无穷多个0)。例如:
输入:
5 53
输出:
5!= 3 1 1
53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
分析:
首先考虑n!如果非常大的话会发生溢出。但此不用考虑,可以单个单个统计n!的每一个乘数,例如5!,首先先看5,5 = 5 ^ 1 = 1,然后看4,4 = 2 ^2 = 2,再看3,3 = 3 ^ 1 = 1,再看2,2 = 2 ^1 = 1,所以5!= 3 1 1。我们用数组prime[100]统计,用下标表示素数,元素表示个数。
代码如下:
//因子和阶乘
#include <stdio.h>
int prime[100];
bool is_prime(int n)//判断n是否为素数
{
for (int i = 2; i * i <= n; i++)
{
if (!(n % i))
{
return 0;
}
}
return 1;
}
int main()
{
int n,i,j,temp,tag;
while (scanf("%d",&n) == 1)
{
for (i = n; i > 1; i--)//解剖n每一个阶乘因子
{
tag = i;
for (j = 2; j <= tag && tag != 1; j++)//统计n的每个阶乘因子由多少相应的素数组成
{
if (tag % j == 0)
{
if (is_prime(j))
{