我试图找到两个数字的lcm,对于其中一个输入案例(28851539和1183019),我的程序返回一个负值。显然它无法计算(28851529 * 1183019)/ 9.
#include <iostream>
long long gcd(int a, int b) {
long long int temp;
if(a%b==0)
{
return b;
}
else
{
temp=a%b;
return gcd(b,temp);
}
}
long long lcm(int a, int b , int g) {
//std::cout<<g;
long long int f=(a*b)/g;
return f;
}
int main() {
long long int a, b;
std::cin >> a >> b;
long long int g = gcd(a,b);
long long int q=lcm(a, b, g);
std::cout << q << std::endl;
return 0;
}
我如何准确计算?
答案 0 :(得分:4)
你的问题是
long long int f=(a*b)/g;
因为(a*b)/g
中的所有类型都是int
,所以这将被计算为int
,如果int
是16或32位,那么它将a
3}}。请注意,由于您已签名类型,因此实际上是overflow。要解决此问题,您需要将b
,g
或long long int
设为long long int
,或者您可以更改函数的参数以使其全部long long int lcm(long long int a, long long int b , long long int g)
第
unsigned long long int
如果您不处理负数,我还建议您使用uint64_t
。如果您不是,则可以使用<cstdint>
中的int64_t
类型,否则select count(1)
from s_srv_req sr, s_evt_act act, s_bu bu
where sr.row_id = act.sra_sr_id(+)
and sr.bu_id = bu.row_id
and sr.last_upd > to_date('31-DEC-2013','DD-MON-YYYY')
and COALESCE(X_REASON_CODE1, X_REASON_CODE2, X_CONCERN_CODE1, X_CONCERN_CODE2, X_COMPONENT_CODE) is not null
使类型名称更短。