Đề bài: 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.
Phân tích:
Ta có : n! = 1.2.3…n
Dễ thấy rằng các số từ 6! trở đi đều chia hết cho 9 vì 6!= 1.2.3.4.5.6= 720
Và giai thừa của các số sau 6 cũng chia hết cho 9 do có chứa 6!:
Vd
Vd
7!= 6!*7 chia hết cho 9
11!= 6!*7*8*9*10*11 chia hết cho 9
Mà 1 số N chia hết cho 9 thì tổng các chữ số tạo nên số đó cũng chia hết cho 9 ta gọi là N1, mà N1 chia hết cho 9 nên tổng các chữ số tạo nên N1 cũng chia hết cho 9……..đến Nn có <= 9, dựa vào định nghĩa :
F(x) = x, nếu x ≤ 9
F(x) = F(S(x)), nếu x > 9
Suy ra : 1<= x <=9 , mà một số có tổng các chữ số chia hết cho 9 có 1 chữ số là 9.
Vd:
8!= 40320 chia hết cho 9 và tổng các chữ số(4+3+2+0) bằng 9.
F(8!) = 40320 với S(8!)= 9 -> F(S(8!))= F(9) = 9.
Vậy bài toán trở nên đơn giản với:
- 1<= n<= 5: F(n!)= 1 ; 2; 6; 6; 3
- n >=6: F(n!)=9
Code (phần code này mình tham khảo tuy nhiên vẫn còn vài chỗ khó hiểu, mình sẽ cố gắng suy nghĩ để hiểu sâu hơn)
void main()
{
int n, fn;
do
{
printf("Nhap n : ");
scanf("%d", &n);
}
while (n<1|| n>500);
switch (n)
{
case 1: fn = 1; break;
case 2: fn = 2; break;
case 3:
case 4: fn = 6; break;
case 5: fn = 3; break;
default: fn = 9; break;
}
printf("F(%d!)= %d\n",n,fn);
}