Sửa lại là :
Code:if (a == b) return a; else if (a > b) return usc(a - b, a); else return usc(a, b - a);
Mình viết cái này không có biết nó mắc chứng gì mà chạy không thèm ra kết quả. Mong anh em cao tay hơn chỉ giáo.
Code:#include<stdio.h> #include<conio.h> int usc(int a,int b) { if(a==b)return a; if(a>b)return usc(a-b,a); return usc(a,b-a); } void main() { clrscr(); int a,b; printf("\n\nNhap vao so a:");scanf("%d",&a); printf("\n\nNhap vao so b:");scanf("%d",&b); printf("\n\nUoc so chung lon nhat cua %d va %d la: ",a,b);usc(a,b); getch(); }
Đã được chỉnh sửa lần cuối bởi anhhungnup : 08-12-2006 lúc 02:39 PM.
Sửa lại là :
Code:if (a == b) return a; else if (a > b) return usc(a - b, a); else return usc(a, b - a);
Vẫn không chạy được bạn ơi.
Đã được chỉnh sửa lần cuối bởi anhhungnup : 08-12-2006 lúc 02:37 PM.
Hình như hàm tính USC sai thì phải, tớ cũng còn 1 ví dụ về phần này, bạn tham khảo nha
Code:#include<stdio.h> #include<conio.h> main() { int a,b,i; a=i; clrscr(); printf("\nNhap vao 2 so : "); scanf("%d %d", &a, &b); while(a%i!=0 || b%i!=0) i--; printf("USCLN:%d", i); getch(); }
Nếu xài vòng lặp thì mình chơi vô tư. Nhưng ở đây mình dùng đệ quy. Mong anh em giúp thêm.
Hix, xin lỗi bạn vì ko xem kĩ, cứ nghe đến đệ quy thì tớ toát mồ hôi rồiNguyên bản được gửi bởi anhhungnup
Mong các bro khác chỉ giúp để tớ cũng được mở mang
giải thuật của bạn bị sai bét nhè:
Code:int usc(int a,int b) { if(a==b)return a; if(a>b)return usc(a-b,a); /* sai ở đây: b chứ không phải là a. Vì a là số lớn, như vậy thì đệ quy sẽ không có điểm dừng*/ return usc(a,b-a); }
Mình thử sữa theo cách của bạn rồi, nhưng vẫn không được, bạn có thể cho mình code của cả chương trình không.
không hiểu muốn làm gì đâyprintf("\n\nUoc so chung lon nhat cua %d va %d la: ",a,b);usc(a,b);
có lẽ thì nên như thế này
printf("\n\nUoc so chung lon nhat cua %d va %d la: %d",a,b,usc(a,b));
mình thấy cách làm như bạn là được rồi, còn cách của ntnam thì thô sơ, và lặp nhiều lần, nếu số nhập vào cỡ 4 tỷ thì ...
nếu làm như bạn thì nên cải tiến 1 chút
bỏ đệ quy, vì đây là đệ quy đuôi, nên có thể chuyển thành vòng lặp
thay vì sử dụng phép - , sử dụng % để nhanh hơn trong 50% trường hợp xấu
như thế này (mẫu dưới này vẫn còn đệ quy, cần phải khử đệ quy)
bạn lấy ý về test lại, không bảo đảm chạy ngayCode:int usc(int a,int b) { if(a>=b) { int d = a % b; if (d == 0) return b; return usc(b, d); } else { int d = b % a; if (d == 0) return a; return usc(a, d); } }
Mình đã sửa bài lại theo cách của bạn nguyentuan2 và đã chạy được rồi, rất cám ơn các bạn đã giúp mình, và mình sẽ làm theo cách thứ 2 của ban nguyentuan2 đã chỉ, có lẽ cách này hay hơn nhiều so với cách của mình.