我正在解决幂和问题(又名忍者编码中的所有可能方法问题)。
给定两个整数a和B,你需要找到并返回我们可以用唯一整数之和的b次幂来表示数字a的可能方法的计数。
下面是代码:
#include <iostream>
#include <cmath>
using namespace std;
int getAllWays(int b, int li, int rem)
{
if (rem==0)
{
return 1;
}
if (li<=0)
{
return 0;
}
int remrt = pow(rem,(1.0/b));
while(remrt>=li)
{
remrt--;
}
// Select case
int v1 = getAllWays(b, remrt, rem-pow(remrt,b));
// Reject case
int v2 = getAllWays(b, remrt, rem);
return v1+v2;
}
int getAllWays(int a, int b)
{
// Write your code here
int li = pow(a,(1.0/b));
li++;
return getAllWays(b, li, a);
}
int main()
{
int a, b;
cin >> a >> b;
cout <<getAllWays(a, b);
}
对于输入100 2
,我在Visual Studio代码中得到输出4,而在Jdoodle和ideone.com等在线编译器中得到输出3。正确的输出是3。
可能是什么原因?我的终端显示的g++版本如下:
C:\Users\username>g++ --version
g++ (MinGW.org GCC-6.3.0-1) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
VS代码截图:
Ideone链接:https://ideone.com/6nDaQI
1条答案
按热度按时间ycl3bljg1#
问题是这样的:
注意:浮点计算会受到精度的影响。结果总是四舍五入。现在你使用的是从
double
到int
的隐式转换,这意味着四舍五入到零。因此,如果一种情况下的结果为10.00001,则将四舍五入为10,但如果结果为9.9999999(接近预期结果),则转换结果将为
9
!由于编译器执行计算的方式存在微小差异,因此您很不幸,得到了与整数值不同的结果。
因此,当舍入浮点数时要小心。使用
std::round
或添加转换容差(epsilon)。或者最好找到不需要使用浮点的解决方案。