ĐỒ ÁN MÔN HỌC NM CNTT1
LỚP CỬ NHÂN TÀI NĂNG KHÓA 2012
Giảng
viên ra đề:
ThS. Trương Phước
Hưng
Bài
3: Tính F(x)
Cho hàm F(x), x ≥ 0 được định nghĩa như sau:
F(x) = x, nếu x ≤ 9
F(x) = F(S(x)), nếu x > 9
Trong đó S(x): tổng các chữ số của x.
Yêu cầu: Hãy viết chương trình tính F(n!), với 1 <= n <= 500.
Bài làm
-
Nhận xét ban đầu:
o
Ta cần phải tìm F(500!). 500! là một số
hết sức lớn, nằm ngoài khả năng lưu trữ của các kiểu dữ liệu. Vậy ta cần tìm
cách tính hàm F mà không cần phải tính n!.
o
Từ công thức đề bài, không khó để thấy kết
quả luôn là số nguyên không âm bé hơn 10.
-
Trước hết, ta khoan xét đến F(n!) mà hãy
xét F(x) với x nguyên dương. Lúc này, hàm F(x) chính là giá trị nhận được khi
ta lặp đi lặp lại quá trình cộng các chữ số của x, với lần lặp sau dùng kết quả
đã có của lần lặp trước làm dữ liệu đầu vào. Đến đây, ta có thể viết một vài
giá trị đầu tiên của dãy F(x) để tìm kiếm quy luật: 1, 2, 3, 4, 5, 6, 7, 8, 9,
1, 2, 3 ,4 … Không quá khó để thấy qui luật của dãy số này:
o
F(x) = 9 với x chia hết cho 9.
o
F(x) = x % 9 với x không chia hết cho 9.
(% là phép chia lấy phần dư).
-
Từ đây, ta có thể dễ dàng tính được
F(x). Vậy còn F(n!) thì sao? Với n≥6, ta có n! chia hết cho 9, vậy thì F(n!) sẽ
bằng 9. Còn với n<6 thì ta chỉ việc lặp và tính kết quả do khi đó n! hoàn
toàn có thể lưu trữ được.
Mã nguồn
#include <iostream> using namespace std; void main() { int iN, iFact = 1; cout << "Nhap n: "; cin >> iN; cout << "F(" << iN << "!) = "; if (iN > 6) iN = 6; for (int i = 2; i <= iN; i++) iFact *= i; if (iN == 0) iFact = 0; cout << 1 + ((iFact - 1) % 9) << endl; }
No comments:
Post a Comment