题目
PAT 甲级 1059 Prime Factors (25分)
思路
素数表
质因子分解
质因子分解的思想:对于整数n
- 质因子全部小于等于sqrt(n)
- 或者,质因子有且仅有一个大于sqrt(n)的质因子,其余的质因子全部小于等于sqrt(n)
易错
- 质数表从2开始线性扫描,不是从0开始
- 题目类型范围为long int,所以factor数组需要开到20个,素数表要记录10000以内的素数
- 质因子分解的终止条件是n==1
题解
#include <iostream>
#include <vector>
#include <cstring>
#include <unordered_map>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
// 质因子的存储
struct Factor {
int x; //质因子
int c; //count质因子数目
} fac[20]; // 对于int类型范围的数,10个质数已经够用了,因为前10个质数2.3.5...23.29乘积超过了int范围
int k=0; //质因子个数
// 素数表 埃式筛法
const int maxn = 10000;
int prime[maxn]; // 质数表
int p[maxn]; //p[i] // i是素数
int num=0; // 质数个数
void prime_find() {
for(int i=2; i<maxn; i++) {
if(p[i]==1)continue; // i不是素数
prime[num++]=i;
for(int j=i+i; j<maxn; j+=i)
p[j]=1; //将当前素数的所有倍数置为非素数
}
}
// 质因子分解 写法1
void factorization(long long n) {
int sqr=(int)sqrt(1.0*n);
for(int i=0; i<num&&prime[i]<=sqr; i++) {
if(n%prime[i]==0) {
fac[k].x = prime[i];
fac[k].c = 0;
while(n%prime[i]==0) {
fac[k].c++;
n/=prime[i];
}
k++;
}
if(n==1)break;
}
if(n>1) {
fac[k].x=n;
fac[k].c=1;
k++;
}
}
// 质因子分解 写法2
void factorization2(long long n) {
for(int i=0; n>1; i++) {
if(n%prime[i]==0) {
fac[k].x=prime[i];
fac[k].c=0;
while(n%prime[i]==0) {
fac[k].c++;
n/=prime[i];
}
k++;
}
}
}
int main(int argc,char * argv[]) {
prime_find(); //获取素数表
long long n;
scanf("%lld",&n);
if(n==1){
printf("1=1");
return 0;
}
// factorization(n);
factorization2(n);
printf("%lld=",n);
for(int i=0; i<k; i++) {
if(i!=0)printf("*");
printf("%d",fac[i].x);
if(fac[i].c>1) {
printf("^%d",fac[i].c);
}
}
return 0;
}