刚开始没看懂题意。。。
输入p1 e1 p2 e2 ....
输出的是 p1^e1 + p2^e2 + ... + pn^en - 1 拆成素数乘积后每个素数的值及指数的值。按素数由大到小输出
暴力枚举就可以。。。
输入那里的字符串处理是学习的别人的。感觉很简洁就用上了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 35000;
int primeNUM[maxn];
struct primestore
{
int n;
int cnt;
}prime[maxn];
struct number
{
int e;
int p;
}num[maxn];
bool cmp( primestore a, primestore b )
{
return a.n > b.n;
}
long long getPow( int p, int e )
{
long long sum = 1;
for( int i = 1; i <= e; i++ )
sum *= p;
return sum;
}
void getPrime( int p )
{
int t = 0;
bool primeflag = 1;
for( int i = 2; i <= p; i++ )
{
primeflag = 1;
for( int j = 2; j <= sqrt( (double) i ); j++ )
{
if( i % j == 0 )
{
primeflag = 0;
break;
}
}
if( primeflag )
primeNUM[t++] = i;
}
}
int main()
{
getPrime( maxn );
while( true )
{
char tmp[50];
int cnt = 0;
int ct = 0;
for( int i = 0; i < maxn; i++ )
{
prime[i].cnt = 0;
prime[i].n = -1;
}
while( scanf( "%s", tmp ) )
{
if( strcmp( tmp, "0" ) == 0 )
return 0;
if( ct == 0 )
{
sscanf( tmp, "%d", &num[cnt].p );
ct = 1;
}
else
{
ct = 0;
sscanf( tmp, "%d", &num[cnt].e );
cnt++;
}
char ch = getchar();
if( ch == '\n' )
break;
}
long long sum = 1;
for( int i = 0; i < cnt; i++ )
{
sum *= getPow( num[i].p, num[i].e );
}
sum--;
int index = 0;
for( int i = 0; primeNUM[i] <= sum; i++ )
{
while( sum % primeNUM[i] == 0 )
{
sum /= primeNUM[i];
prime[index].cnt++;
prime[index].n = primeNUM[i];
}
if( prime[index].n == primeNUM[i] )
index++;
}
sort( prime, prime + index, cmp );
for( int i = 0; i < index - 1; i++ )
{
printf( "%d %d ", prime[i].n, prime[i].cnt );
}
printf( "%d %d\n", prime[index-1].n, prime[index-1].cnt );
}
return 0;
}