质因子分解

点击查看代码
#include<cstdio>
#include<cmath> //使用sqrt()
#pragma warning(disable:4996)

//对正整数n进行质因子分解

const int factor_maxnum = 10; //对于int型范围的数,它的质因子种类不超过10种
struct factor {
	int x, cnt; //质因子数x,x的个数
}fac[factor_maxnum]; //存储正整数n的质因子种类和每种的个数

const int maxn = 101; //素数表长,下标从0开始(注:0不是素数)
int prime[maxn], pNum = 0; //prime[]存放素数(存储[2,sqrt(n)]范围内的素数),pNum是素数个数
bool p[maxn] = { 0 }; //p[i]=true表示i是素数
//埃氏筛法,设置素数表
void Find_Prime() {
	//从2开始,枚举2~maxn内的数
	for (int i = 2; i < maxn; i++) {
		if (p[i] == false) { //i没有被筛除,是素数(算法由2这个素数启动)
			prime[pNum++] = i; //将i存入prime[]中
			for (int j = i + i; j < maxn; j += i) {
				//在2*i~maxn中,筛去所有i的倍数
				p[j] = true; //i是j的因数,因此j不是素数,p[j]设为true表示j已被筛除
			}
		}
	}
}

int main() {	
	int n, num = 0; //对正整数n进行质因子分解,num记录n的质因子种类数
	scanf("%d", &n);

	Find_Prime(); //设置素数表

	//遍历素数表
	for (int i = 0; i < pNum; i++) {
		//统计n可以分解出的质因子数和它的个数
		if (n % prime[i] == 0) { //prime[i]是n的质因子
			fac[num].x = prime[i]; //存储质因子prime[i]
			fac[num].cnt = 0; //将prime[i]的个数初始化为0
			while (n % prime[i] == 0) {	//计算n可以分解为多少个prime[i]
				fac[num].cnt++;	//质因子prime[i]个数加一
				n /= prime[i]; //n除以prime[i]再进行下一轮计算
			}
			num++; //n的质因子种类加一,统计下一种质因子
		}
	}
	if (n != 1) { //当遍历完素数表prime[]后,n仍大于1
		fac[num].x = n; //此时n是大于sqrt(n)的质因子(可能是n本身),存储质因子数n
		fac[num++].cnt = 1; //质因子n的个数为一
	}
	//输出n的质因子x和x的个数
	for (int i = 0; i < num; i++) {
		printf("%d %d\n", fac[i].x, fac[i].cnt);
	}
	
	return 0;
}

posted @ 2022-09-28 23:08  zhaoo_o  阅读(12)  评论(0编辑  收藏  举报