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.
Nhận định bài toán:
Theo hướng đơn giản thông thường ta nhập vô số n thỏa điều kiện trên, sau đó ta tính n!, rồi chia lấy
phần nguyên n! cho 10 để tách từng số ra
rồi cộng tất cả lại, nếu lớn hơn 9 ta tiếp tục lặp lại bước trên. Với sử lý của
máy tính thì cũng không mất thời gian lắm.
nhưng nếu vậy , ta gặp rắc rối đơn giản nếu ta nhập giá trị n =500 thì 500! là
một số vô cùng lớn( khoảng 1300 chữ số), ta không có kiểu lưu trữ nào có thể
đáp ứng yêu cầu như trên. Tham khảo ý kiến của mấy bạn trong lớp, mấy bạn pro
chỉ tôi là dùng mảng, mỗi mảng biểu diễn 1 con số, vậy là có thể giải quyết bài toán, nhưng do chưa có
kiến thức lập trình tôi không biết xài mảng làm sao.( vì thầy chưa dạy). nhưng nhờ mấy bạn nhắc là đâu nhất thiết phải
tính số đó ra, đây là bài toán mẹo. bây giờ ta tinh giá trị của 10 tự nhiên ban
đầu:
Giá trị n
|
Giá trị n!
|
Giá trị F(x)
|
0
|
1
|
1
|
1
|
1
|
1
|
2
|
2
|
2
|
3
|
6
|
6
|
4
|
24
|
6
|
5
|
120
|
3
|
6
|
720
|
9
|
7
|
5040
|
9
|
8
|
40320
|
9
|
9
|
362288
|
9
|
|
|
|
Nhận định thấy với n>=6 thì kết quả đều bằng 9 vì sao vậy?
Lý do : theo lý thuyết ta học lúc trung học cơ sở ta có: với n là số nguyên ta
luôn có: (n-2)(n-1)n luôn chia hết cho 3.
Xét tiếp
(n+1)(n+2)(n+3) luôn chia hết cho 3
Vì vậy ta suy ra => (n-2)(n-1)n(n+1)(n+2)(n+3) chia hết
cho 9 hay 6! Chia hết cho 9
Với các số khác lớn hơn 6 ta luôn đưa về dạng : k*6! Chia hết
cho 9
Xét 1 số chia hết
cho 9 thì tổng các chữ số đó phải chia hết cho 9. Vậy bài toán tưởng chừng như
phức tạp lại được giải quyết 1 cách dễ
dàng. Dù giá tri n có lớn đến mấy ta đều tính được.
Code bài giải:
#include<iostream>
#include<conio.h>
using namespace
std;
void main()
{
int n,s;
cout<<"nhap gia tri n:";
cin>>n;
if(n<0)
{
cout<<"nhap gia tri n sai!!!,nhap lai";
return;
}
else
{
if(n==0||n==1)
{
s=1;
}
if(n==2)
{
s=2;
}
if(n==3||n==4)
{
s=6;
}
if(n==5)
{
s=3;
}
if(n>=6)
{
s=9;
}
}
cout<<"gia tri cua ham F(x) la: "<<s<<endl;
getch();
}
|
|
Không có nhận xét nào:
Đăng nhận xét