一个奇怪的 C++ 错误,可能是相对于 long long 类型
A strange C++ error, maybe it is relative to the long long type
我的代码如下:
#include <iostream>
int gcd(int a, int b) {
//write your code here
if(a==0){
return b;
}else if(b==0){
return a;
}else if(a>b){
int a_pri=a%b;
return gcd(b,a_pri);
}else if(a<b){
int b_pri=b%a;
return gcd(a,b_pri);
}else{
return a;
}
}
long long lcm(int a, int b) {
int temp_gcd = gcd(a,b);
long long abproduct = a*b;
long long result = abproduct/temp_gcd;
return result;
}
int main() {
int a, b;
std::cin >> a >> b;
std::cout << lcm(a,b) << std::endl;
return 0;
}
我想输出两个数的最大公倍数。
但是当我输入两个数字 14159572 63967072 时,它输出一个负数 -527892768.But 正确答案应该是 226436590403296。
看起来输出被截断为 32 位。
所以,我打印变量 temp_gcd
,它是 4.I 改变了表达式
long long result = abproduct/temp_gcd;
到
long long result = abproduct/4;
然后输出正确答案。
问题在线long long abproduct = a*b;
由于a
和b
都是int
,对它们的任何操作都会导致int
,在这种情况下会导致溢出。在计算时尝试将 a
或 b
转换为 long long
。
long long abproduct = (long long)a * b;
不想编辑@MahlerFive 的答案 - 这应该也可以。我会像这样将 a 和 b 转换为 long long:long long abproduct = static_cast<long long>(a)*static_cast<long long>(b)
.
您正在执行 int
乘法,因为这是操作数的数据类型。更改该数据类型。即,改变
long long lcm(int a, int b)
到
long long lcm(long long a, long long b)
不要采纳使用强制转换的建议:强制转换应该永远是万不得已的措施,比如去 war(仅在政客和外交官失败后)。
如果您不更改函数签名,则可以通过将 a*b
替换为 1LL*a*b
来强制进行转换。但我不建议在这里。使用正确的数据类型是正确的方法。
还是代码
long long abproduct = a*b;
long long result = abproduct/temp_gcd;
不必要地添加结果可能溢出的情况。为了减少这种情况,
long long result = a*(b/temp_gcd);
注意这不能丢弃信息(不过,一般来说,您必须小心整数除法丢弃信息)。
我的代码如下:
#include <iostream>
int gcd(int a, int b) {
//write your code here
if(a==0){
return b;
}else if(b==0){
return a;
}else if(a>b){
int a_pri=a%b;
return gcd(b,a_pri);
}else if(a<b){
int b_pri=b%a;
return gcd(a,b_pri);
}else{
return a;
}
}
long long lcm(int a, int b) {
int temp_gcd = gcd(a,b);
long long abproduct = a*b;
long long result = abproduct/temp_gcd;
return result;
}
int main() {
int a, b;
std::cin >> a >> b;
std::cout << lcm(a,b) << std::endl;
return 0;
}
我想输出两个数的最大公倍数。
但是当我输入两个数字 14159572 63967072 时,它输出一个负数 -527892768.But 正确答案应该是 226436590403296。
看起来输出被截断为 32 位。
所以,我打印变量 temp_gcd
,它是 4.I 改变了表达式
long long result = abproduct/temp_gcd;
到
long long result = abproduct/4;
然后输出正确答案。
问题在线long long abproduct = a*b;
由于a
和b
都是int
,对它们的任何操作都会导致int
,在这种情况下会导致溢出。在计算时尝试将 a
或 b
转换为 long long
。
long long abproduct = (long long)a * b;
不想编辑@MahlerFive 的答案 - 这应该也可以。我会像这样将 a 和 b 转换为 long long:long long abproduct = static_cast<long long>(a)*static_cast<long long>(b)
.
您正在执行 int
乘法,因为这是操作数的数据类型。更改该数据类型。即,改变
long long lcm(int a, int b)
到
long long lcm(long long a, long long b)
不要采纳使用强制转换的建议:强制转换应该永远是万不得已的措施,比如去 war(仅在政客和外交官失败后)。
如果您不更改函数签名,则可以通过将 a*b
替换为 1LL*a*b
来强制进行转换。但我不建议在这里。使用正确的数据类型是正确的方法。
还是代码
long long abproduct = a*b;
long long result = abproduct/temp_gcd;
不必要地添加结果可能溢出的情况。为了减少这种情况,
long long result = a*(b/temp_gcd);
注意这不能丢弃信息(不过,一般来说,您必须小心整数除法丢弃信息)。