题意:输入: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操作也很强大。