标签:
阶乘和因子
要求:输入正整数n(1<n <101), 把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2,3,5,...)的指数。
例如825=3x52x11应表示成(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
算法代码:
#include <iostream> #include <cstring> using namespace std; int prime[100], cnt; bool isPrime(int n) //判断素数,n不能太大 { if(n < 2) return 0; for(int i = 2; i * i <= n; i++) if(n % i == 0) return 0; return 1; } int main() { for(int i = 2; i <= 100; i++) if(isPrime(i)) prime[cnt++] = i; //构造素数表 int N, p[100]; while(cin >> N) { if(N < 2 || N > 100) break; memset(p, 0, sizeof(p)); int max = 0; for(int i = 1; i <= N; i++) { int m = i; //需要把i复制到m中,而不要在做除法时直接修改它 for(int j = 0; j < cnt; j++) { while(m % prime[j] == 0) //反复除以prime[j],并累加p[j] { m /= prime[j]; p[j]++; if(j > max) max = j; //更新最大素因子下标 } } } for(int i = 0; i <= max; i++) //只循环到最大下标 { cout << p[i] << " "; } cout << endl; } }
标签:
原文地址:http://www.cnblogs.com/jeakeven/p/4642657.html