我正在使用模运算符,但它仍然给我一个负数
I am using modulo operator, but it still giving me a negative number
我正在尝试解决 C++ 中的编程问题(版本:(MinGW.org GCC Build-2) 9.2.0)
我正在使用模运算符在 int 范围内给出答案,但是对于 6 ,它给了我 -ve answer
为什么会这样??
我的代码:
#include <cmath>
#include <iostream>
using namespace std;
int balancedBTs(int h) {
if (h <= 1) return 1;
int x = balancedBTs(h - 1);
int y = balancedBTs(h - 2);
int mod = (int)(pow(10, 9) + 7);
int temp1 = (int)(((long)(x) * x) % mod);
int temp2 = (int)((2 * (long)(x) * y) % mod);
int ans = (temp1 + temp2) % mod;
return ans;
}
int main()
{
int h;
cin >> h;
cout << balancedBTs(h) << endl;
return 0;
}
输出:
代码做了两个隐含的假设:
- int 至少是 32 位(否则 mod 的 1,000,000,007 将不适合)
- long 比 int 大(避免乘法溢出)
这些假设都没有得到标准的保证https://en.cppreference.com/w/cpp/language/types
我无法访问问题中的同一平台,但如果我在 temp1 和 temp2 的分配中删除对 long 的转换,我可以准确地重现输出(有效地模拟平台是 sizeof int 和 long都是 4).
您可以通过检查 sizeof(int) 和 sizeof(long) 来验证第二个假设是否适用于您的平台。
我正在尝试解决 C++ 中的编程问题(版本:(MinGW.org GCC Build-2) 9.2.0)
我正在使用模运算符在 int 范围内给出答案,但是对于 6 ,它给了我 -ve answer
为什么会这样??
我的代码:
#include <cmath>
#include <iostream>
using namespace std;
int balancedBTs(int h) {
if (h <= 1) return 1;
int x = balancedBTs(h - 1);
int y = balancedBTs(h - 2);
int mod = (int)(pow(10, 9) + 7);
int temp1 = (int)(((long)(x) * x) % mod);
int temp2 = (int)((2 * (long)(x) * y) % mod);
int ans = (temp1 + temp2) % mod;
return ans;
}
int main()
{
int h;
cin >> h;
cout << balancedBTs(h) << endl;
return 0;
}
输出:
代码做了两个隐含的假设:
- int 至少是 32 位(否则 mod 的 1,000,000,007 将不适合)
- long 比 int 大(避免乘法溢出)
这些假设都没有得到标准的保证https://en.cppreference.com/w/cpp/language/types
我无法访问问题中的同一平台,但如果我在 temp1 和 temp2 的分配中删除对 long 的转换,我可以准确地重现输出(有效地模拟平台是 sizeof int 和 long都是 4).
您可以通过检查 sizeof(int) 和 sizeof(long) 来验证第二个假设是否适用于您的平台。