Chủ Nhật, 25 tháng 11, 2012
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:
Đăng ký:
Bài đăng (Atom)