问题描述:输入正整数n(2=<n<=100)把阶乘n!=1*2*...100,分解成因子相乘的形式,从小到大输出各个素数的(2,3,5,7,...)的指数,例如825 = 3*5*5*11 应表示成(0,1,2,0,1)的形式。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <assert.h>
#include <cmath>
using namespace std;
int is_prime(int x){
assert(x>=0);
if(x==1) return 0;
int m = floor(sqrt(x)+0.5);
for(int i=2;i<=m;i++){
if(x%i == 0) return 0;
}
return 1;
}
int prime[100],count=0;
int main()
{
for(int i=2;i<=100;i++){
if(is_prime(i)) prime[count++] = i;
}
int n,p[100];
while(scanf("%d",&n)!=EOF){
memset(p,0,sizeof(p));
int maxp = 0;
for(int i=1;i<=n;i++){
int m=i;
for(int j=0;j<count;j++){
while(m%prime[j]==0){
m/=prime[j];
p[j]++;
if(j>maxp) maxp = j; //最大素数下标
}
}
}
printf("%d!=",n);
for(int i=0;i<=maxp;i++)
printf("%d ",p[i]);
printf("\n");
}
return 0;
}
测试结果如下: