2011-09-25 35 views
6

Tôi đã bắt đầu chương trình này để tính ước số chung lớn nhất. Đây là những gì tôi có cho đến thời điểm này:Chương trình C++ để tính ước số chung lớn nhất

#include <iostream> 
#include <math.h> 
using namespace std; 
int getGCD(int a, int b) 
{ 
    a = a % b; 
    if (a == 0) 
    { 
     return b; 
     b = b % a; 
    } 
    if (b == 0) 
    { 
     return a; 
    } 
} 
int main() 

{ 
    int x, y; 
    cout << "Please enter two integers x and y, for GCD calculation" << endl; 
    cin >> x >> y; 
    cout << "The GCD of " << x << "and " << y << " is" << getGCD(x, y) << endl; 
    return 0; 
} 

Tôi luôn nhận được 0 cho GCD. Tôi đang làm gì sai?

+1

b = b% a; sẽ không bao giờ thực hiện – Mikhail

+0

kiểm tra trả lại dòng b; và tự hỏi, làm sao chương trình có thể thực thi b = b% a; nếu bạn đã nói trước khi quay trở lại chức năng này. – dowhilefor

+0

nếu đây là bài tập về nhà, bạn nên thêm thẻ thích hợp :) –

Trả lời

2

Bạn nên lặp lại để tìm điều này và có thể hữu ích nếu bạn đặt, với một số phương trình, thuật toán của bạn về cách thức hoạt động của tính năng này.

Nhưng bạn có hai vấn đề tôi thấy, trừ khi bạn đang gọi điều này bên trong vòng lặp khác.

Bạn đang quay trở lại trong cả hai trường hợp, nếu là hoặc nếu không, vì vậy bạn chỉ đi qua đây một lần.

Ngoài ra, phần này không có ý nghĩa, tại sao sửa đổi giá trị b sau khi thực hiện return?

  return b; 

      b = b%a; 

Bạn nên sử dụng đệ quy cho điều này, btw.

http://rosettacode.org/wiki/Greatest_common_divisor#Recursive_Euclid_algorithm

+2

Không nên sử dụng đệ quy cho việc này. Lặp lại để tìm GCD là đủ tốt cho Euclid (* Các yếu tố * khoảng 300 TCN, sách VII, các mệnh đề 1 và 2), và nó đủ tốt cho bạn. –

+0

@EricPostpischil - Đệ quy làm cho một giải pháp đơn giản, tôi tin, nhưng, cuối cùng nó phụ thuộc vào những gì OP muốn làm, tôi chỉ đưa ra ý kiến ​​của tôi, với một liên kết đến nguồn để giúp đỡ. –

2
int getGCD(int a, int b) { 

// ở đây chúng ta cần phải kiểm tra xem b == 0 trở lại một thi

if (b == 0) { 
     return a; 
    } 
    return gcd(b, a % b); 
} 

Euclid Thuật toán

+0

Kiểm soát có thể kết thúc chức năng không có hiệu lực. –

+0

dòng b = a% b phải là a = a% b và ngược lại – muhammedabuali

Các vấn đề liên quan