poj 1365 Prime Land 质因数分解
刚开始没看懂题意。。。
输入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; }

浙公网安备 33010602011771号