【PAT甲级、C++、数学】1059 Prime Factors (25分)

# include <iostream>
# include <climits>
# include <vector>
# include <cmath>

using namespace std;

const int maxn = 100010;
vector<int> prime;
bool p[maxn] = {false};  // 埃式筛法,p[i] == false说明未被筛选掉,p[i]是素数;否则不是
void Find_Prime()
{
    for(int i=2;i<maxn;++i)
        if(p[i] == false){
            prime.push_back(i);
            for(int j=i+i;j<maxn;j+=i)
                p[j] = true;
        }
}

struct Fact{
    int x;    // 质因子
    int cnt;  // 相同质因子的个数
};

int main()
{
    Find_Prime();
    long long N;
    cin >> N;
    
    // 特例为1的情况
    if(N == 1){
        cout << "1=1" << endl;
        return 0;
    }
    printf("%lld=", N);
    
    vector<Fact> F;
    // 遍历素数表,找到质因子(每一次循环都会判断一个质数是不是质因子,是就加入F并且找到有多少个相同的,不是就及你如下一次循环)
    for(size_t i=0;i<prime.size();++i)  // 这里的条件判断可以再加一个&& prime[i]<=sqrt(N)会更快一点(没追求,无所谓,在循环结束后面还要判断N!=1,麻烦死)
    {
        // 找到一个质因子
        if(N % prime[i] == 0)
        {
            F.push_back({(int)prime[i], 0});
        
            // 找相同的质因子有多少个
            while(N % prime[i] == 0){
                F.back().cnt++;
                N /= prime[i];
            }
        }
        
        if(N==1) break; // 及时退出循环,加快速度(没追求,无所谓)
    }

    
    // 按格式输出
    for(size_t i=0;i<F.size();++i)
    {
        cout << F[i].x;
        if(F[i].cnt > 1)
                cout << "^" << F[i].cnt;
        if(i!=F.size()-1)
            cout << "*";
    }cout << endl;
    
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值