Thứ Tư, 21 tháng 11, 2012

VẤN ĐỀ Ở ĐÂY LÀ GÌ (bài 3 - đề án)


Lời nói đầu: có những vấn đề nhìn vào rất phức tạp và hoàn toàn không thể tìm ra một hướng đi phù hợp nhưng khi bạn chịu khó đầu tư vào mặt “chất xám” cho vấn đề ấy bạn sẽ tìm ra những nhận xét dễ đến ngỡ ngàng. Trong lập trình cũng vậy, người lập trình càng đầu tư cho việc tối ưu hoá thuật toán cũng như tìm ra những “ bí quyết độc môn” cho bài toán ấy thì chương trình chạy càng nhanh và hiệu quả. Sau đây mình xin xét lại hàm f(x) mà trong bài đăng VÒNG LẶP WHILE TRONG C/C++ mình đã từng đề  cập đến chỉ là ở đâu bài toán sẽ phức tạp hơn nhiều lần.
Bài toán đặt ra:
                                   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 và x=n!   1≤   n  ≤ 500

Giải quyết vấn đề:

Như các bạn thấy ở đây x= n! nếu n nhỏ thì ta có thể dễ dàng tính n! bằng nhiều cách thế nhưng khi n=500 thì 500! Vượt xa tất cả cách kiểu lưu trữ chúng ta có trong ngôn ngữ C/C++ như vậy ở đây chúng ta có 2 cách lựa chọn:
-          Tạo ra một kiểu số mới với miền giá trị đủ sức chứa 500!
-          Suy nghĩ một giải thuật đặc biệt mà mọi người thường gọi là “mẹo”.

Thứ Ba, 20 tháng 11, 2012

VÒNG LẶP WHILE TRONG C/C++


     Đối với bất cứ ai đã từng bước chân vào một ngôn ngữ lập trình thì vòng lặp là điều không thể thiếu nhưng ở đây mình xin nói đến vòng lặp while của ngôn ngữ C/C++.
    ĐỀ BÀI:
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.
     CÁCH SUY LUẬN:
-         Như các bạn thấy ở đây hàm số f(x)=x khi x≤ 9 nếu x>9 thì việc tính S(x) phải được thực hiện cho đến khi x’ ≤ 9 è việc tính S(x) phải được lặp cho đến khi x≤ 9
è  Việc sử dụng while hay do while sẽ tốt hơn for do số lần lặp chưa xác định.
-         Việc cần làm thứ 2 là làm ra hàm S(x) cũng là lặp nhiệm vụ sau:
oSum_num = Sum_num+ (x % 10);
oX= x/10
Lưu ý: hai phép “ % “ (mod) &  “ / ” (div) chỉ được dùng đúng với nghĩa mod, div khi x là số nguyên.
     BÀI GIẢI THAM KHẢO:


#include
#include

long tongcso(int x)
{
    long kq;
    kq=0;
    while (x !=0)
         {
             kq=kq+(x % 10);
             x=x/10;
         }
    return kq;
}

void main()
{
    long x,x0;
    printf(" nhap vao so x");
    scanf("%ld",&x);
    x0=x;
    while (x>9)
         {
             x=tongcso(x);
         }
    printf(" ket qua ham f(%ld)= %ld ",x0,x);

}


Chủ Nhật, 18 tháng 11, 2012

VÍ DỤ VỀ VÒNG LẶP IF ELSE TRONG C/C++


  • Bài toán đặt ra:

Nhập vào ngày tháng năm của 1 năm bất kỳ xuất ra:
-         Ngày trước đó.
-         Ngày sau đó.
-         Tháng đó có bao nhiêu ngày.
-         Ngày tháng có hợp lệ không.
  • Ý tưởng ban đầu:

Đầu tiên ta có thể chia ra 3 nhóm cơ bản:
-         Nhóm 1: tháng 1,3,5,7,8,10,12.
-         Nhóm 2: 4,6,9,11.
-         Nhóm 3: tháng 2
(với việc chỉ  xét xem tháng đó có bao nhiêu ngày)
Nhưng yêu cầu 1,2 lại xét thêm ngày tháng sau và trước đó, do đó ta lại chia lại thành các nhóm sau:
-         Nhóm 1: tháng 5,7,8,10.
-         Nhóm 2: tháng 4,6,9,11.
-         Nhóm 3: tháng 3.
-         Nhóm 4: tháng 2.
-         Nhóm 5: tháng 1.
-         Nhóm 6: tháng 12.

Thứ Bảy, 17 tháng 11, 2012

CHIA HẾT VỚI SỐ THỰC ( bài 1 - đề án )


  • Bài toán đặt ra:
    Cho số tự nhiên A. Hãy tìm số tự nhiên N nhỏ nhất sao cho N lũy thừa N (nhân N cho chính nó N lần) chia hết cho A. Hãy viết chương trình tìm số N đó và xuất ra màn hình. Trong đó A có giá trị: 1 A 109
Ví dụ:
Số nhập vào là A
Số xuất ra là N
8
4
13
13


Thứ Sáu, 16 tháng 11, 2012

VÍ DỤ VỀ ĐỆ QUY TRONG LẬP TRÌNH


TÍNH  N!
  • Mô tả
-n! (n giai thừa) là tích các số từ 1 cho đến chính nó. 
-nghĩa là n!=1*2*3*...(n-1)*n;
ví dụ: 6!=1*2*3*4*5*6=720;
  • Bài toán đặt ra:
Tính F(x)   với   1<=x<=500
Cho hàm F(x), x ≥ 0 được định nghĩa như sau:
F(x) = S(x)!
Trong đó S(x): tổng các chữ số của x.

  • Cách giải đề xuất:

GIẢI TOÁN VỚI NGÔN NGỮ C/C++ (bài 2_ đề án )




  • Bài toán đặt ra:


Xem công thức tính sau đây (đề thi tuyển sinh cao học ngành KHMT, năm 2011):

Trong đó Max, Min lần lượt là giá trị lớn nhất, nhỏ nhất của n số thực (được nhập vào từ thiết bị nhập chuẩn) a0, a1, …, an-1.

Chỉ dùng duy nhất 1 vòng lặp (for hoặc while), đề xuất cách thức để nhập n số thực như trên và tính giá trị của biểu thức Aver, xuất kết quả tính ra thiết bị xuất chuẩn. Viết chương trình để minh họa đề xuất đó.

Lưu ý: chỉ dùng các phép toán gán, vòng lặp, if ... đặc biệt không dùng mảng: