阶乘分解
题目描述
输入正整数n(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。要求你的程序在输出时忽略比正整数n的最大素因子更大的素数,否则会导致末尾有无穷多个0。
输入格式
输入正整数n(2≤n≤100)[多组测试数据]
输出格式
n!=(一个空格)a1(一个空格)a2(一个空格)a3…
[a1,a2,a3等数字为分解后素数(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
思路:
1.首先是find()打标记录素数表
2.因为是阶乘,所以遍历2~n,然后进行分解
3.分解时,变为素数时即可中止,但是有一个小坑,就是1不是素数,所以中止不了,所以要判断一下,但是结束时候不要把1记录进去。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100010];
int ans[105]={0};
int idx=0;
bool isPrime(int x){
if(x<2) return false;
if(x==2) return true;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0) return false;
}
return true;
}
void find(int n){
for(int i=2;i<=n;i++){
if(isPrime(i)){
a[idx++]=i;
}
}
}
void fenjie(int x){
int test=x;
while(!isPrime(x)){
for(int i=0;i<idx;i++){
if(x%a[i]==0){
ans[a[i]]++;
x/=a[i];
}
}
if(x==1) break;
}
if(x!=1){
ans[x]++;
}
}
main(){
int n;
while(cin>>n){
memset(ans,0,sizeof(ans));
find(n);
for(int i=2;i<=n;i++){
if(isPrime(i)){
ans[i]++;
}else{
fenjie(i);
}
}
cout<<n<<"!= ";
for(int i=1;i<=100;i++){
if(ans[i]!=0){
cout<<ans[i]<<" ";
}
}
cout<<endl;
}
}