PAT甲题题解-1059. Prime Factors (25)-素数筛选法
用素数筛选法即可。
范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄。
而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为int根号后大小不超过60000。
即因子的大小不会超过60000,除非本身是质数。
int 4 -2147438648~+2147438647
long int 4 -2147438648~+2141438647
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> using namespace std; /* 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄。 而现在其实就是int的范围,那难度当次就不一样了,瞬间变成水题一枚,根号后大小不超过60000。 int 4 -2147438648~+2147438647 long int 4 -2147438648~+2141438647 */ const int maxn=60000; bool isprime[maxn]; int prime[maxn]; int cnt=0; void init(){ for(int i=0;i<maxn;i++) isprime[i]=true; for(int i=2;i<maxn;i++){ if(isprime[i]){ prime[cnt++]=i; for(int j=2*i;j<maxn;j+=i) isprime[j]=false; } } } int main() { int num; init(); scanf("%d",&num); printf("%d=",num); bool first=true; int factor=0; for(int i=0;i<cnt;i++){ int e=0; while(num%prime[i]==0){ e++; num=num/prime[i]; factor++; } if(e==0) continue; if(first){ printf("%d",prime[i]); first=false; } else printf("*%d",prime[i]); if(e>1) printf("^%d",e); } //以防万一num本身是质数 if(factor==0) printf("%d",num); return 0; }