因式分解,鼓捣一会就出来了,这道题里又学会了sscanf与scanf类比时的不同,sscanf每次读取的都是这个串的从前往后读。
处理整行数据时可以多读取个%c判断c即可判断是否到行结束
//============================================================================
// Name : poj.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
struct P{
int N, Num;
}ans[40000];
long long ansn, num, t, temp, n, a, b;
bool flag[40000];
int prime[40000];
char s[1000];
char c1, c2;
int main() {
memset(flag, true, sizeof(flag));
memset(prime, 0, sizeof(prime));
for(int i = 2;i <= 40000/2;i++){
if(flag[i]){
for(int j = i << 1;j <= 40000;j+=i){
flag[j] = false;
}
}
}
num = 0;
for(int i = 2;i <= 32767;i++){
if(flag[i] == true){
prime[++num] = i;
}
}
while(1){
scanf("%d", &a);
if(a == 0) break;
scanf("%d%c", &b, &c1);
n = pow(a, b);
if(c1 == ' '){
while(scanf("%d%c%d%c", &a, &c1, &b, &c2)){
n *= pow(a, b);
if(c2 == '\n') break;
}
}
n -= 1;
temp = n;
if(flag[n] == true){
printf("%lld 1\n", n);
continue;
}
ansn = 0;
while(temp > 1){
for(int i = 1;i <= num&&prime[i] <= temp;i++){
if(temp%prime[i] == 0){
t = 1;
temp/=prime[i];
while(temp%prime[i] == 0){
t++;
temp /= prime[i];
}
ansn++;
ans[ansn].N = prime[i];
ans[ansn].Num = t;
}
}
}
for(int i = ansn;i > 0;i--){
if(i == 1)printf("%d %d\n", ans[i].N, ans[i].Num);
else printf("%d %d ", ans[i].N, ans[i].Num);
}
}
return 0;
}