poj 1365 Prime Land

题意:输入:a1,b1,a2,b2....。求出x=a1^b1 * a2^b2 * ....。将x-1这个数分解成素数的乘积。并将这些素数按从大到小的顺序输出及其幂。

思路:求出所有的素数。求出x,再因式分解。本题比较难的部分是处理输入。参考C++ primer。

#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 40000;
int prime[4000];
int mark[MAXN];
int result[4000][2];
void init() {
    int i, j;
    for(i=2; i<MAXN; ++i) mark[i] = 1;
    mark[1] = 0;
    int cnt = 0;
    //存素数
    for(i=2; i<MAXN; ++i) {
        if(mark[i]) {
            prime[cnt++] = i;
            for(j=i+i; j<MAXN; j+=i) mark[j] = 0;
        }
    }
}
int main() {
    int x, y, sum;
    string line;
    init();
    freopen("/home/lsy/Desktop/2.txt", "r", stdin);
    while(getline(cin, line)) {
        if("0" == line) break;
        istringstream stream(line);
        sum = 1;
        while(stream >> x >> y) sum *= (int)pow((double)x, y);
        sum --;
        int i;
        memset(result, 0, sizeof(result));
        int m = 0;
        for(i=0; prime[i]<=sum; i++) {
            int k = 0;
            while(sum % prime[i] == 0) {
                k++;
                sum /= prime[i];
            }
            if(k) {
                result[m][0] = prime[i];
                result[m][1] = k;
                m++;
            }
            if(1 == sum) break;
        }
        for(i=m-1; i>=1; --i) cout << result[i][0] << " " << result[i][1] << " ";
        cout << result[0][0] << " " << result[0][1] << endl;
    }
    return 0;
}
总结:c++ 的I/O操作也很强大。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值