较大值的答案溢出
Overflow of answer for larger values
我正试图使用以下公式找到一个数字的LCM。Lcm=Gcd/(a*b(。这对于较小的数字来说是很好的,但是对于较大的数字,它会溢出,就像代码中显示的那样。我尝试使用long-long作为变量类型,但仍然没有效果。如何解决溢出问题?
#include <iostream>
#include <vector>
using namespace std;
long long int LCM(int n1, int n2){
const int size = 2;
long long int sum;
long long int gcd;
long long int lcm = 0;
vector<int> number(2);
number[0] = n1;
number[1] = n2;
while (true)
{
sum = number[0] % number[1];
gcd = number[1];
if (sum == 0)
break;
number[0] = number[1];
number[1] = sum;
}
lcm = ((n1*n2)/gcd);
return lcm;
}
int main()
{
cout << LCM(28851538, 1183019) << endl;
system("pause");
}
有一个微不足道的改进。
您计算(n1*n2(/gcd。如果n1*n2太大而无法放入整数,则会溢出。一个明显的变化是计算((long-long(n1*(long-leng(n2(/gcd。只要n1*n2不太大而不能放入long-long中,这就可以了。
但是,假设您要将此函数与长参数一起使用。请记住,gcd是n1和n2的最大公约数。它是n1的除数和n2的除数。因此,计算(n1/gcd(*n2或(n2/gcd(*n1,会得到相同的结果。除非最终结果太大,否则不会出现溢出。
所以只需将返回语句更改为
return (n1 / gcd) * n2;
由于您知道gcd
平分为两个数字,因此只需更改运算顺序:
lcm = n1*(n2/gcd);
long long int LCM(int n1, int n2)
参数为int!
vector<int> number(2)
为什么又是int?
lcm = ((n1*n2)/gcd)
使用n1/gcd*n2
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 首要问题的答案让值班员搞错了
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 同一对象的"sizeof"的不同答案
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 较大值的答案溢出
- c++给出了奇怪的大数字答案(恐怕不是溢出)