如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。 输入描述: 输入一个正整数n(2 ≤ n ≤ 10^18)
输出描述: 如果n是一个超级素数幂则输出p,q,以空格分隔,行末无空格。 如果n不是超级素数幂,则输出No
输入例子: 27
输出例子: 3 3
注意2401这种数是偶数幂次的,所以在第一开方结果为整数,但非素数时,需要再进行遍历。 long double 128 位,用在程序里会出bug。。
#include <iostream> #include <cmath> using namespace std; bool isPrime(long long n) { if (n <= 1) return false; if (n == 2) return true; for (int i = 2; i <= sqrt(n); ++i) { if (n%i == 0) return false; } return true; } int main() { long long n; cin >> n; for (long long i = 2; i <= sqrt(n); ++i) { double base = pow((double)n, 1.0 / (double)i); if (abs(base - (long long)base)<0.00001) { long long temp = (long long)base; if (isPrime(temp)){ cout << temp << " " << i << endl; return 0; } } } cout << "No" << endl; return 0; }