点击查看代码
#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;
}