我用 C 语言编写了一个递归函数来反转整数 (123 -> 321),当我在 Mac 上运行它时,它运行得很好,但当我的老师在运行 Windows 的计算机上运行它时,它的行为却很奇怪。
int rev(int num)
{
int base;
if (num < 10) return (num);
base = pow(10,(int)log10(num));
return(rev(num/10)+num%10*base);
}
例如,在 OSX 上调用 rev(8765) 返回 5678,在 Windows 上,rev(8765) 返回 5672。我无法访问 Windows 计算机来尝试在调试模式下运行程序,所以我一直在很难猜测问题是什么。我将非常感谢任何见解!
环境:
我正在使用 OSX 10.8 和 GCC 4.2。我很确定我的导师正在使用 MinGW 作为她的编译器。
pow
和 log10
不需要正确舍入;它们产生的结果在平台之间可能会有所不同,即使对于“应该”与您的示例中完全相同的情况也是如此。 在这种情况下,OS X 生成的结果比 Windows 更准确,这会导致仅在 Windows 输出中显示的错误。
一个更好更好的解决方案是在整数中重复使用除法和乘法10,并且根本不使用浮点(有一个与您类似的非常干净的递归解决方案,不需要您计算
base
)。
顺便说一句:这是“可耻的”,这么多数学库不能正确处理 log10
、
log2
、exp2
和 pow
中的 10 和 2 的小幂。 设计这些函数以使它们为这些情况做“正确的事情”并不难,并且可以在不对其他情况的性能产生不利影响的情况下完成。 虽然标准没有要求,但这是一件简单的事情,并且有助于使缺乏经验的程序员避免出现这样的(异常常见的)错误。