Giới thiệu
Cho hai phân số a/b và c/d (a,b,c,d là số nguyên, b,d ≠ 0). Tính tổng hai phân số.
Quy tắc: Để cộng hai phân số, mẫu số phải bằng nhau. Nếu khác nhau, quy đồng mẫu số (thường dùng BCNN), sau đó cộng tử số.
Ví dụ
Input: 1/4 + 2/12 → Output: 5/12 Giải thích: BCNN(4,12)=12 → 1/4 = 3/12 → 3/12 + 2/12 = 5/12 Input: 1/4 + 2/4 → Output: 3/4 (mẫu đã bằng nhau)
Thuật toán
Hàm gcd(a, b): // Ước chung lớn nhất (Euclid) Nếu a == 0 → trả về b Trả về gcd(b%a, a) Hàm smallest(den3, n3): // Rút gọn phân số common_factor = gcd(n3, den3) den3 = den3 / common_factor n3 = n3 / common_factor Hàm add_frac(n1, den1, n2, den2, n3, den3): den3 = gcd(den1, den2) // UCLN mẫu số den3 = (den1*den2) / den3 // BCNN = tích / UCLN n3 = n1*(den3/den1) + n2*(den3/den2) // Tử số mới Gọi smallest(den3, n3) // Rút gọn Hàm main: n1=1, den1=4, n2=2, den2=12 Gọi add_frac → in kết quả
Code C
#include <stdio.h>
int gcd(int a, int b) {
if (a == 0) return b;
return gcd(b%a, a);
}
void smallest(int *den3, int *n3) {
int common_factor = gcd(*n3, *den3);
*den3 = *den3 / common_factor;
*n3 = *n3 / common_factor;
}
void add_frac(int n1, int den1, int n2, int den2, int *n3, int *den3) {
*den3 = gcd(den1, den2);
*den3 = (den1 * den2) / *den3; // BCNN
*n3 = n1 * (*den3 / den1) + n2 * (*den3 / den2);
smallest(den3, n3);
}
int main() {
int n1=1, den1=4, n2=2, den2=12, den3, n3;
add_frac(n1, den1, n2, den2, &n3, &den3);
printf("%d/%d + %d/%d = %d/%d\n", n1, den1, n2, den2, n3, den3);
return 0;
}
Kết quả
1/4 + 2/12 = 5/12