看到1<=p<10101 我就去想大数操作了,后来看了discuss原来double完全可以放。
类型 长度 (bit) 有效数字 绝对值范围
float 32 6~7 10^(-37) ~ 10^38
double 64 15~16 10^(-307) ~10^308
long double 128 18~19 10^(-4931) ~ 10 ^ 4932
接下来就是直接用pow(n,1/p)就可以了。
#include<iostream>
#include<cmath>
using namespace std;
double n,p;
int main(){
while(cin>>n>>p){
cout<<pow(p,1/n)<<endl;
}
}
还看到一种二分法,由p最大值最小值的中间值开始猜k,通过比较pow(k,n)与p的大小来进一步精确k,直到找到。
#include<stdio.h>
#include<math.h>
#define eps 0.0000000001
void init(), work();
double n, m, k;
int main()
{
init();
return 0;
}
void init()
{
while(scanf("%lf %lf", &n, &m) != EOF)
work();
}
void work()
{
long long left, right, mid;
left = 0;
right = 1000000002;
while(left + eps < right){
mid = (left + right) / 2;
if(pow(mid, n) - m > 0)
right = mid;
else
if(pow(mid, n) - m < 0)
left = mid;
else{
printf("%.0ld\n", mid) ;
break;
}
}
}