问题描述
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
bool check(ll num)
{
ll temp=num;
ll sum=0;
while(num!=0)
{
ll rem=num%10;
sum+=pow(rem,3);
num/=10;
}
if(sum==temp)
return true;
else
return false;
}
int main()
{
ll num;
cin>>num;
if(check(num))
cout<<"It is a Armstrong number"<<endl;
else
cout<<"Not a Armstrong number"<<endl;
return 0;
}
当 num 在第二次迭代中等于 153 时,rem 的值是 5,但是当我把它放在 pow 函数中时,它给了我 124 但 5 pow 3 等于 125 谁能告诉我这是什么问题
解决方法
pow
函数对浮点类型而不是整数进行操作,它返回一个浮点类型。您会看到整数截断与浮点错误相结合的结果。考虑通过基于整数的方法计算整数幂,或者如果您必须使用 std::pow
,则使用 std::round
对结果进行四舍五入。
例如:
sum += static_cast<ll>(std::round(std::pow(rem,5)));
或者像这样幼稚的东西:
sum += rem * rem * rem * rem * rem;
,
因为您没有使用标准的包含标头,所以我不能保证您使用的是 std::pow
中的 <cmath>
重载之一,其中一些采用整数类型作为指数。 (您可以使用没有重载的 C 样式 pow
)。
您对 using namespace std;
的使用进一步混淆了事情。尽管为了清楚起见,在教程中使用了它,但它从未用于高质量的生产代码。
在我看来,任何 std::pow
的实现如果不能恢复带有整数参数的最佳浮点值,都应该被认为是有缺陷的。也就是说,我所知道的标准(甚至 IEEE754)都没有提供任何此类保证。 (参见 std::sqrt
。)您会发现您的实现将 pow(x,y)
评估为 exp(y * log(x))
,这可能导致结果低于 x
看似微不足道的值的真实值,并且y
。
对于像 3 这样的小指数,最好长手写出来:
sum += rem * rem * rem;
如果您确实被一个有缺陷的 std::pow
实现的平台所诅咒,那么您总是可以针对整数参数推出自己的平台。 平方取幂是经常使用的技术。