因子和阶乘

来源:互联网 发布:淘宝信用卡套现手续费 编辑:程序博客网 时间:2024/05/22 12:36

输入正整数(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)){prime[j]++;if (j > temp){temp = j;//temp保存最大素数}tag /= j;j--;}}}}for (i = 2; i <= temp; i++)//输出结果{if (is_prime(i)){printf("%d ",prime[i]);}}printf("\n");}return 0;}