2016-12-11 60 views
-2

我想我不是調用函數或正確傳遞它。以下是我遇到的一些小問題。試圖在C++中計算GCD

使用測試數據,1/2和8/16將返回1/2而不是1/1。

這是我的代碼來計算GCD:

void Fractions::gcd(int n, int d) 
{ 
int a,b,c; 
a = n; 
b = d; 

while (a%b != 0) 
{ 
    c = a % b; 
    a = b; 
    b = c; 
} 
num = n/b; 
denom = d/b; 
} 

這是計算從輸入數字相加,並計算出這些數字基於GCD代碼:

Fractions Fractions::operator+(Fractions& fraction2) 
{ 

Fractions totalAddition; 
totalAddition.num = (num * fraction2.denom + denom * fraction2.num); 
totalAddition.denom = (denom * fraction2.denom); 
totalAddition.gcd(num, denom); // i think issue is here 
return totalAddition; 
} 
+0

1/2是8/16的不可縮減形式。我不明白是什麼問題。 – StoryTeller

回答

2

唯一的問題這裏是函數的名字。

一個函數調用gcd應該返回最大公約數:

int gcd(int n, int d) { 
    int a, b, c; 
    a = n; 
    b = d; 

    while (a % b != 0) { 
    c = a % b; 
    a = b; 
    b = c; 
    } 

    return b; 
} 

它並不需要成爲Fraction一個成員函數來做到這一點 - 它可以是一個獨立的功能,這是更好,因爲它使得Fraction更加封裝。但是你可以給它用以消化Fraction過載:

int gcd(const Fraction& frac){ 
    return gcd(frac.numerator(), frac.denominator()); 
} 

名稱gcd是簡潔的一面,但在上下文中很清楚。

你的函數在做什麼是簡化一個分數,作爲Fraction對象的成員函數,並且覆蓋Fraction的成員變量。因此,它應該被稱爲simplify,並且不需要採取任何輸入:

void Fractions::simplify() { 
    int a, b, c; 
    a = num; 
    b = denom; 

    while (a % b != 0) { 
    c = a % b; 
    a = b; 
    b = c; 
    } 
    num = n/b; 
    denom = d/b; 
} 

你可能會發現你並不需要一個gcd功能,在這種情況下simplify就足夠了。但是,如果您確實需要這兩種功能,則可以在此避免一些代碼重複:

void Fractions::simplify() { 
    int g = gcd(*this); 
    num /= g; 
    denom /= g; 
}