以下代码在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;
}
答案 0 :(得分:5)
问题表明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
确保所需的尺寸。