题目链接:https://vjudge.net/problem/POJ-2109
知识点: C++语法
解题思路:
\(double\) 的取值范围为 \(10^{-307}~10^{308}\),小数精度是前\(16\)位,用 \(double\) 存储 \(p\) 时,虽然会产生误差,但其误差范围在 \(10^{-15}\) 的数量级内。接下来用 \(pow(p,1/n)\) 求其开 \(n\) 次方值,由于开方运算不会扩大其误差范围且题目已经规定了该题的答案必为整数值,\(10^{-15}\)这个级别的误差在四舍五入以后对于整数部分的影响可以忽略不计,故直接用\(pow()\)函数即可求出答案。
AC代码:
1 #include <cmath> 2 #include <cstdio> 3 using namespace std; 4 5 int main(void) { 6 double n , p; 7 while(scanf("%lf%lf",&n,&p)==2) { 8 double tmp = pow(p, 1 / n); 9 int k = floor(tmp + 0.5); // 四舍五入(+0.5后向下取整) 10 printf("%d\n",k); 11 } 12 return 0; 13 }