【发布时间】:2021-10-01 17:25:00
【问题描述】:
我正在解决 Nth root of M 问题,我用 Java 解决了它,这是解决方案:
public int NthRoot(int n, int m)
{
// code here
int ans = -1;
if (m == 0)
return ans;
if (n == 1 || n == 0)
return m;
if (m == 1)
return 1;
int low = 1;
int high = m;
while (low < high) {
int mid = (low + high) / 2;
int pow = (int)Math.pow(mid, n);
if (pow == m) {
ans = mid;
break;
}
if (pow > m) {
high = mid;
} else {
low = mid + 1;
}
}
return ans;
}
它通过了所有的测试用例。但是,当我使用 C++ 解决它时,一些测试用例没有通过。这是 C++ 解决方案:
int NthRoot(int n, int m)
{
// Code here.
int ans = -1;
if (m == 0)
return ans;
if (n == 1 || n == 0)
return m;
if (m == 1)
return 1;
int low = 1;
int high = m;
while (low < high) {
int mid = (low + high) / 2;
int po = (int)pow(mid, n);
if (po == m) {
ans = (int)mid;
break;
}
if (po > m) {
high = mid;
} else {
low = mid + 1;
}
}
return ans;
}
它没有通过的一个测试用例是:
6 4096
Java's output is 4 (Expected result)
C++'s output is -1 (Incorrect result)
当我用纸和笔追踪它时,我得到了与 Java 相同的解决方案。
但是,当我在 C++ 代码中使用 long long int 时,它工作得很好——但是在 Java 和 C++ 中 Int/int 的大小是一样的,对吧? (当我在 C++ 和 Java 中打印 INT_MAX 和 Integer.MAX_VALUE 时,它输出相同的值。)
【问题讨论】:
-
您是否尝试过调试 C++ 程序以查看何时何地出错?此外,如果没有正确的 minimal reproducible example(查看如何调用此函数以及使用哪些参数),无论如何都无法说出任何确定的内容。
-
"但是 Int 在 Java 和 C++ 中的大小是一样的,对吧?" - 在 Java 中,
ints are 32-bit integrals。在 C++ 中,int的大小在语言规范中没有确定。根据不同的因素,它至少可以是16或32位。如果需要 32 位有符号整数,请使用int32_t。 -
(int)pow(mid, n);-- 这并不能保证你会得到你想要的结果。pow函数是一个浮点函数,有pow() will not give the correct results 的实例。如果问题可以使用整数解决,请不要使用浮点函数、变量等。 -
您是否检查过
std::pow(2048, 6)返回的内容以及您的数据类型(int、long long int)的最大值是多少,以及 c++ 与 java 相比如何处理溢出? -
@Marivishnu 不,你不正确。再说一遍,Java 不是 C++,你正落入陷阱。 Java 具有固定的整数大小,C++ 整数大小取决于实现,但必须有相对于各种整数类型(short、int、long 等)的大小保证。
标签: java c++ algorithm binary-search