用C ++计算10 ^ 9中的数字

时间:2016-04-15 13:33:58

标签: c++ c++11

我试图找到两个数字的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;
}

我如何准确计算?

1 个答案:

答案 0 :(得分:4)

你的问题是

long long int f=(a*b)/g;

因为(a*b)/g中的所有类型都是int,所以这将被计算为int,如果int是16或32位,那么它将a 3}}。请注意,由于您已签名类型,因此实际上是overflow。要解决此问题,您需要将bglong 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 使类型名称更短。