问题描述
对于以下代码:
int digsum(ll num) { //function to calculate sum of digits
if (num < 0)
num = abs(num);
int ans = 0;
while (num != 0) {
ans = ans + num % 10;
num = num / 10;
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int a,b,c,cnt = 0;
long long x;
cin >> a >> b >> c;
for (int i = 0; i <= 72; i++) {
x = (b * (pow(i,a))) + c;
if (i == digsum(x) && x < mod) {
cout << x << " ";
}
}
return 0;
}
分别在a,c = 3,2,8
和i=19;
的情况下
pow(19,3)
应该计算 19^3 但是当我用 (19x19x19) 替换 pow
时,这个特定情况得到了满足,而 pow
函数不是这种情况。
有人能解释一下是什么问题吗?
解决方法
我的超能力表明您的标准库对 pow
的实现并不精确。我记得不久前关于这个主题的讨论。请记住,pow
返回一个浮点值。我无法重现它,但由于它的优化方式,这完全有可能是您对 pow(19,3)
的调用返回 6858.999999999
或类似的。
确实,这 this page 说明了很多:
由于浮点数的舍入错误,pow() 的结果可能不精确(即使您传递的是整数或整数)。
此外,这个 question and answer 暗示了同样的事情。
我不会怀疑它,但你去了。
考虑将此作为一种解决方法:
long long power = nearbyint(pow(i,a));
x = b * power + c;