浙江工商大学20机试(oj复试)阶乘分解

阶乘分解

题目描述
输入正整数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;
	}	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值