质因数

所谓质因数分解就是指将一个正整数n写成一个或多个质数的乘积的形式,例如6 = 2 * 3,8 = 2 * 2 * 2,180 = 2 * 2 * 3 * 3 * 5。写成指数的形式,例如6 = 2^1 * 3^1, 8 = 2^3, 180 = 2^2 * 3^2 * 5^1;

struct factor{
	int x, cnt;//x为质因子,cnt为其个数 
}fac[10]; 

考虑到2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29超过int范围,因为对一个fac数组的大小只需要开到10就可以了。
一个正整数n来说只能存在一个大于等于sqrt(n)的质因子 ,所以分两步判断:1.先判断出小于sqrt(n)的质因子,再判断大于sqrt(n)的

#include <cstdio>
#include <math.h>
const int maxn = 100010;
int prime[maxn], pNum = 0;
int p[maxn] = {0};

void Find_prime(){
	for(int i = 2; i< maxn; i++){
		if(p[i] == false){
			prime[pNum++] = i;
			for(int j = i + i; j < maxn; j += i){
				p[j] = true;
			}
		}
	}
}

struct factor{
	int x, cnt;//x为质因子,cnt为其个数 
}fac[10]; 

int main(){
	Find_prime();
	int n, num = 0;//num为n的不同质因数的个数 
	scanf("%d", &n); 
	if(n == 1 ) printf("1 = 1");   //特判1的情况 
	else {
		printf("%d=", n);
		int sqr = (int)sqrt(1.0 * n);
		//枚举根号n以内的质因子
		for(int i = 0; i < pNum && prime[i] <= sqr; i++){
			if(n % prime[i] == 0) {//如果prime[i]是n的因子
				fac[num].x = prime[i];
				fac[num].cnt = 0;
				while(n % prime[i] == 0){//计算出质因子prime[i]的个数 
					fac[num].cnt++;
					n /= prime[i]; 
				}
				num++; //不同质子个数+1 
			} 
			if(n == 1) break;//及时推出循环,节省时间 
	}
	
		if(n != 1){//如果无法被根号n以内的质因子除尽
			fac[num].x = n; //那么一定有一个大于根号n的质因子
			fac[num++].cnt = 1;		
		} 
	
	//按格式输出
		for(int i = 0; i < num; i++){
			if(i > 0) printf("*");
			printf("%d", fac[i].x);
			if(fac[i].cnt > 1){
				printf("^%d", fac[i].cnt); 
			}
		} 
    }
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值