- [ ] # Những kiến thức C++ đã học thêm ## Chia trong C++ * Khi a, b là 2 số nguyên (nếu là số thập phân thì những ý sau vẫn hoạt động đúng): - Chia lấy nguyên: a/b - Chia lấy dư: a%b - Chia lấy số thập phân chính xác: (double)a/b, 1.0*a/b ## round(), ceil(), floor() - round() làm tròn chính xác (gần nhất) - Ví dụ: round(8.1) = 8 round(8.6) = 9 round(8.5) = 9 - ceil() làm tròn trên: - Ví dụ: - ceil(10.9) = 11 - ceil(10.5) = 11 - ôceil(10.1) = 11 - floor() làm tròn dưới: - Ví dụ: - floor(10.9) = 10 ## [>n && %k==0](https://lqdoj.edu.vn/problem/kh06) - Đáp án: n/k*k+k - Giải thích - n/k*k thì ta được một số luôn chia hết cho k và nhỏ hơn hoặc bằng n. - sau đó cộng k vào phần trên, ta được một số lớn hơn n và vẫn giữ nguyên được tính chất chia hết cho k. - ## GCD, LCM: * GCD: * Greatest : Lớn nhất * Common: Chung * Divisor: Ước Divisors of 18: 1, 2, 3, 6, 9, 18 Divisors of 36: 1, 2, 3, 4, 6, 9, 12, 18, 36 GCD(18, 36) = 18 * LCM: * Least: Nhỏ nhất * Common: Chung * Multiple: Bội Multiples of 4: 4, 8, 12, 16, 20, 24, 28, ... Multiples of 7: 7, 14, 21, 28, 35, 42, ... LCM(4, 7) = 28 ## Thuật tìm GCD của Euclid: * Giả sử ta đang tìm GCD của a và b * Ta thực hiện vòng lặp cho đến khi a vẫn khác b: * Nếu a lớn hơn b, gán a = a-b * Ngược lại (b > a), gán b = b-a * Kết thúc vòng lặp ta được 2 số a và b bằng nhau * Vậy UCLN của a và b khi a và b bằng nhau chính là a hoặc b (vì chúng bằng nhau); * Chứng minh * Đặt GCD(a, b) = d * => a chia hết cho d, b chia hết cho d * Giả sử a > b, ta suy ra được: (a-b) cũng sẽ chia hết cho d * Vậy GCD(a, b) = GCD(a-b, b) (Khi a > b) ## Hàm GCD trong C++ * Thư viện <algorithm> * Cú pháp: __gcd(a, b) ## Cách tìm UCLN của một mảng số: * Ta đặt g là kết quả sau khi tìm ước chung lớn nhất của mảng a, khởi tạo g = 0; * Lưu ý gcd(0, x) = x * Sau đó ta lần lượt duyệt tất cả các phần tử trong mảng bằng cách gán g là ước chung lớn nhất của g với giá trị hiện tại. (g = gcd(g, a[i])) * Code python ` g = 0 for v in arrr: g = gcd(g, v) ` ## 1 giây, C++ xử lí được khoảng 10 mủ 8 phép tính. ## Nhập xuất file * Khi yêu cầu đề là: * Input: CAU1.inp * Output: CAU1.out * Ta sẽ làm như thế này: ``` freopen("CAU1.inp", "r", stdin); freopen("CAU1.out", "w", stdout); ``` * Khi yêu cầu đề là: * Input: stdin * Output: stdout * Ta sẽ làm như thế này: ``` #ifndef ONLINE_JUDGE freopen("inp.txt", "r", stdin); #endif ``` ## Tăng tốc chương trình C++ ``` cin.tie(0)->sync_with_stdio(0); cout.tie(0)->sync_with_stdio(0); ```