Sample Input:【int范围内的整数,所以素数表开到10^5左右就可以了】
97532468
Sample Output: 【重因子要合并】
97532468=2^2*11*17*101*1291
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#define maxSize 100010
using namespace std;
int prime[maxSize] = { 0 };
int judgePrime(int ex) {//判断一个数是否为素数
int flag = 1;
if (ex <= 1) return 0;
int sqr = (int)sqrt(ex * 1.0);
for (int i = 2; i <= sqr; i++) {
if (ex%i == 0) {
flag = 0;
break;
}
}
return flag;
}
//得到区间内的素数
int getPrime() {
int flag = 0;
for (int i = 2; i < maxSize; i++) {
//不能写成 <= 吗?书上说会导致程序运行崩溃,但实测并没有啊
if (judgePrime(i)) {
prime[flag++] = i;
}
}
return flag;
}
//分解一个数
void resolve(int tar, int num) {
int current = prime[0];
int flag = 0, k = 0;//flag用于判断是否为首位
int pre = 1, sum = 0;//sum记录重因子个数
cout << tar << "=";
while (tar != 1 && k < num) {
if (tar % current == 0) {//可整除
if (flag) {
if (pre == current) sum++;
else {//新因子
if(sum > 1) cout <<pre<<"^"<<sum<<"*";//重因子
else cout << pre << "*";
pre = current;//保存新因子
sum = 1;
}
}
else {//首个因子
pre = current;
sum++;
flag = 1;
}
tar = tar / current;
}
else {//不能整除
current = prime[++k];
}
}//while
if (tar != 1) cout << tar << endl;//现有素数无法分解此数,原样输出
else if(sum > 1)
cout << pre << "^" << sum << endl;//重因子
else
cout << pre << endl;
}
int main() {
int N;
cin >> N;
int num = getPrime();//得到区间内的素数
resolve(N, num);
return 0;
}