- [ ]
# 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);
```