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;
}
View Code

 

posted @ 2017-03-06 18:06  辰曦~文若  阅读(276)  评论(0编辑  收藏  举报