C++中的相同代码在VS代码和在线编译器(如ideone)中给出不同的输出

xghobddn  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在解决幂和问题(又名忍者编码中的所有可能方法问题)。
给定两个整数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

ycl3bljg

ycl3bljg1#

问题是这样的:

int remrt = pow(rem, (1.0/b));
...
int li = pow(a,(1.0/b));

注意:浮点计算会受到精度的影响。结果总是四舍五入。现在你使用的是从doubleint的隐式转换,这意味着四舍五入到零。
因此,如果一种情况下的结果为10.00001,则将四舍五入为10,但如果结果为9.9999999(接近预期结果),则转换结果将为9
由于编译器执行计算的方式存在微小差异,因此您很不幸,得到了与整数值不同的结果。
因此,当舍入浮点数时要小心。使用std::round或添加转换容差(epsilon)。或者最好找到不需要使用浮点的解决方案。

相关问题