题目链接:点击打开链接
题意:有指数函数 k^n = p ,
其中k、n、p均为整数且 1<=k<=10^9 , 1<=n<= 200 , 1<=p<10^101
给定 n 和 p ,求底数 k
题解:这道题!!,我第一反应是大数的快速幂=-=。然后写了一整套的大数加减乘除,大数比较函数,和快速幂,然后就很自然的时间超时。为什么我会想到大数的快速幂呢。=-=主要是看到输入的数字都是10的一百次方,输入都输入不进去。后来听dalao讲解才想起来double的取值范围为10^(-307)~10^308,但小数精度只有前16位。用double去存,然后二分+高精度来处理这道题。高精度真难=-=
后来看到一种公式的解法,然后感觉自己的智商真不够用
公式为
k^n = p ,所以k = p开n次方 = p 的1/n次方 。所以直接k = pow(p,1.0/n) ort..!!!
这道题我推荐大家去学习一下double的存数字的方式
二分+高精度:
#include<cstdio>
#include<cmath>
#define eps 0.000000000001
double n,m,k;
int main(){
while(~scanf("%lf %lf",&n,&m)){
long long left,right,mid;
left = 0;
right = 100000002;
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;
}
}
}
}
公式:
#include <math.h>
#include <iostream>
using namespace std;
int main(void) {
double n , p;
while(cin >> n >> p) {
double tmp = pow(p, 1 / n); // p开n次方
int k = floor(tmp + 0.5); // 四舍五入(+0.5后向下取整)
cout << k << endl;
}
return 0;
}