Thứ Ba, 27 tháng 11, 2012


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