题意:
给出n 和 p
求 (开出来的是个整数)
思路:
由于开出来的是个整数,开出来的数的范围1 < <1e9 ,可以用二分来猜数,然后再用大数相乘来判断。
后来,看到一片博客,原来double 就够了。
原先一直以为double最大值是(1 << 63) - 1 ,但是double不同于int,他们的存储方式是不一样的,double 和 float 都是用科学计数法来表示:符号+指数+位数。
(浮点类型存储方式blog连接:http://blog.youkuaiyun.com/lai123wei/article/details/7220684
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
double pow(int n, int t)//这里自己写了一个pow函数,防止系统自带的函数会造成溢出,double最大值可以存1e308(只不过精度不能保证)
{
double ret = 1;
for(int i = 1; i <= t; i++)
{
ret *= n;
if(ret > 1e102)
{
return ret;
}
}
return ret;
}
int main()
{
double n, p;
while(cin >> n >> p)
{
int st = 1, ed = 1e10;
while(st <= ed)
{
int mid = st + (ed - st) / 2;
double t = pow(mid, n);
// cout << t << endl;
if(p == t)
{
printf("%d\n", mid);
break;
}
if(p < t)
{
ed = mid - 1;
}
else
{
st = mid + 1;
}
}
}
return 0;
}