PAT A1059 Prime Factors
思路:对int范围内的整数进行质因数分解,采用打质数表法。
注意由于前10个质数乘积已经超过int最大值范围,只需要开辟Factors大小为10来记录每个质数及其重复次数。
而由于质因子关于sqrt(n)的对称性质,若当前质因子>sqrt(n)时,可判断n本身即为质数。
#include<cstdio>
const int maxn = 100010;
int prime[maxn];
int pnum = 0;
bool is_prime(int x) {
if(x <= 1) return false;
for(int i = 2; i*i <= x; i++) {
if(x % i == 0) return false;
}
return true;
}
void FindPrime() {
for(int i = 2; i < maxn; i++) {
if(is_prime(i) == true) {
prime[pnum++] = i;
}
}
}
typedef struct {
int x;
int cnt;
} Factors;
Factors fac[10];
int main() {
FindPrime();
int n, num = 0;
scanf("%d", &n);
if(n == 1) {
printf("1=1");
return 0;
}
printf("%d=", n);
for(int i = 0; i < pnum && prime[i] * prime[i] <= n; i++) {
if(n % prime[i] == 0) {
fac[num].x = prime[i];
fac[num].cnt = 0;
while(n % prime[i] == 0) {
fac[num].cnt++;
n /= prime[i];
}
num++;
}
}
if(n > 1) {
fac[num].x = n;
fac[num++].cnt = 1;
}
for(int i = 0; i < num; i++) {
printf("%d", fac[i].x);
if(fac[i].cnt > 1)
printf("^%d", fac[i].cnt);
if(i < num - 1) printf("*");
}
return 0;
}