以下代码在20个测试用例中的一个上打印错误答案.如果有人能找到逻辑错误,我会很感激.
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
using namespace std;
int main() {
double n, p;
cin >> n >> p;
int k = pow(p, 1 / n);
cout << k;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题表明p ? 10^100
.double
对于那么大的所有整数(*),没有确切的表示.如果最接近的浮点表示p
小于精确p
,则返回的浮点值pow(p, 1 / n);
也将小于预期值k
.
转换浮点数时,小数部分将被截断,即数字向下舍入.因此,如果计算的浮点值k'
小于精确值k
,则k'
转换为整数即可k - 1
.
由于您可以保证得到一个接近正确整数的浮点数,但是可以通过舍入到最接近的整数而不是向下舍入来解决问题.JSF已经给出了算法:0.5
在舍入之前添加.
(*)64位IEEE 754浮点可以表示精确到10 ^ 17的整数.
此外,存在结果大小的潜在问题.如果int
平台上的大小是2个字节,那么k
将溢出.int
对于给定的范围,4字节就足够了k
.您可以使用保证所需的大小int32_t
.