[英]How to convert this Python code to C++
我在Python中有一個有效的算法,想將其轉換為C ++:
def gcd(a, b):
if (a % b == 0):
return b
else:
return gcd(b, a % b)
def solution(N, M):
lcm = N * M / gcd(N, M)
return lcm / M
我遇到了輸入值較大的問題,因為N和M的倍數會導致整數溢出,並且使用long
來存儲其值似乎無濟於事,除非我做錯了事。
這是我當前的代碼:
int gcd(int a, int b)
{
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
int solution(int N, int M) {
// Calculate greatest common divisor
int g = gcd(N, M);
// Calculate the least common multiple
long m = N * M;
int lcm = m / g;
return lcm / M;
}
首先,更改:
long m = N * M;
int lcm = m / g;
至:
long long m = (long long)N * M;
int lcm = (int)(m / g);
通常,您最好將代碼中的每個int
更改為unsigned long long
...
但是,如果手頭有一些BigInt
類,則可能要改用它。
這是免費的一個: http : //planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=9735&lngWId=3
它存儲任何可能大小的自然數,並支持C ++中提供的所有算術運算符。
您正在計算g=gcd(N,M)
,然后是m=N*M
,然后是lcm=m/g
,最后返回lcm/M
這與返回N/gcd(N,M)
。 您不需要這些中間計算。 擺脫它們。 現在,溢出沒有問題(除非M = 0,也就是說,您無法避免)。
int solution(int N, int M) {
if (M == 0) {
handle_error();
}
else {
return N / gcd(N,M);
}
}
問題出在long m = N*M.
乘法僅作為32位整數發生。 由於兩者均為int
類型,因此會發生溢出。
校正long long m = (long long)N*M
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.