Đến nội dung

Hình ảnh

Sử dụng PASCAL trong các bài toán tổ hợp chọn số

* * * * * 1 Bình chọn Tổ hợp Lập trình Pascal

  • Please log in to reply
Chủ đề này có 15 trả lời

#1
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
Các bạn thân mến!
PASCAL là một ngôn ngữ lập trình cơ bản, hầu hết mọi người trong chúng ta đều đã từng học qua. Nó là một ngôn ngữ lập trình đơn giản rất dễ học, tuy ứng dụng không được phong phú, vì Pascal và sản phẩm của nó chạy trên nền DOS, nhưng ngôn ngữ này rất mạnh về cấu trúc logic của nó!
Trong bài viết này, tôi sẽ giới thiệu với các bạn cách sử dụng PASCAL để giải quyết các bài toán tổ hợp chọn số. Một mặt các bạn sẽ giải bằng kiến thức tổ hợp thông thường, mặt khác các bạn sẽ có được một công cụ để kiểm tra kết quả của mình.
Các bạn có thể Download chương trình PASCAL tại http://www.mediafire.com/?dzazztnza1w

Trước tiên, tôi xin nêu ra một số đề bài:

Bài toán 1: Có bao nhiêu số tự nhiên lẻ có $5$ chữ số, trong số đó phải có mặt chữ số $3$?

Bài toán 2: Cho các chữ số $\{0,1,2,3,4,5,6\}$ Tính tổng của các số tự nhiên chẵn, có $4$ chữ số đôi một khác nhau, được lập từ $7$ chữ số trên.

Bài toán 3: Cho $A=\{0,1,2,3,5,7,8,9\}$. Có bao nhiêu số tự nhiên chẵn có $5$ chữ số, trong số đó phải có mặt số $1$ và số $3$, được tạo thành từ $A$
____________________________________
$\boxed{1}$ Bây giờ ta bắt tay vào giải quyết Bài toán 1 (bằng PASCAL)
Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcde}$, vậy cần có $5$ biến $a,b,c,d,e$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $9$
- $b,c,d$ ta cho chạy từ $0$ đến $9$
- Vì $\overline{abcde}$ là số lẻ nên ta cho $e$ chạy từ $1$ đến $9$ và chỉ thực hiện công việc tiếp nếu $e \in \{1,3,5,7,9\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "có mặt chữ số 3"
thì ta cho kết quả $S$ tăng thêm 1 đơn vị.
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 01']
Var a,b,c,d,e: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=1 to 9 do
if ((e=1)or(e=3)or(e=5)or(e=7)or(e=9))and((a=3)or(b=3)or(c=3)or(d=3)or(e=3)) then
S:=S+1;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }21672$

$\boxed{2}$ Giải bài toán 2:

Bài toán 2: Cho các chữ số $\{0,1,2,3,4,5,6\}$ Tính tổng của các số tự nhiên chẵn, có $4$ chữ số đôi một khác nhau, được lập từ $7$ chữ số trên.


Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcd}$, vậy cần có $4$ biến $a,b,c,d$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $6$
- $b,c$ ta cho chạy từ $0$ đến $6$
- Vì $\overline{abcd}$ là số chẵn nên ta cho $d$ chạy từ $0$ đến $6$ và chỉ thực hiện công việc tiếp nếu $d \in \{0,2,4,6\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "các chữ số đôi một khác nhau"
thì ta cho kết quả $S$ cộng thêm giá trị của $\overline{abcd}=1000*a+100*b+10*c+d$
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 02']
Var a,b,c,d: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 6 do
for b:=0 to 6 do
for c:=0 to 6 do
for d:=0 to 6 do
if ((d=0)or(d=2)or(d=4)or(d=6))and((a<>b)and(a<>c)and(a<>d)and(b<>c)and(b<>d)and(c<>d)) then
S:=S+1000*a+100*b+10*c+d;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }1577160$

$\boxed{3}$ Giải bài toán 3
Bài toán 3: Cho $A=\{0,1,2,3,5,7,8,9\}$. Có bao nhiêu số tự nhiên chẵn có $5$ chữ số, trong số đó phải có mặt số $1$ và số $3$, được tạo thành từ $A$


Bước1:Xây dựng thuật toán:
- Ta cần xây dựng số $\overline{abcde}$, vậy cần có $5$ biến $a,b,c,d$ kiểu shortint
- Thêm một biến $S$ kiểu longint để nhận kết quả.
- Đầu tiên gán kết quả $S:=0$
- Vì $a \ne 0$ nên ta sẽ cho $a$ chạy từ $1$ đến $9$ và chỉ lấy các giá trị thuộc A
- $b,c,d$ ta cho chạy từ $0$ đến $9$ và chỉ lấy các giá trị thuộc A
- Vì $\overline{abcde}$ là số chẵn nên ta cho $e$ chạy từ $0$ đến $8$ và chỉ thực hiện công việc tiếp nếu $e \in \{0,2,8\}$
- Cuối cùng nếu số tạo thành thoả mãn điều kiện "phải có mặt chữ số 1 và chữ số 3"
thì ta cho kết quả $S$ tăng thêm 1 đơn vị
Thuật toán thật đơn giản phải không nào!
Bước 2: Viết code và trình bày kết quả:

[quotename='PASCAL CODE 03']
Var a,b,c,d,e: shortint;
S: longint;
Begin
S:=0;
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=0 to 8 do
if ((e=0)or(e=2)or(e=8))and((a<>4)and(a<>6))and((b<>4)and(b<>6))and((c<>4)and(c<>6))
and((d<>4)and(d<>6))
and(((a=1)and((b=3)or(c=3)or(d=3)))or((b=1)and((a=3)or(c=3)or(d=3)))
or((c=1)and((a=3)or(b=3)or(d=3)))or((d=1)and((a=3)or(b=3)or(c=3))))
then
S:=S+1;
Write('So cac so thoa man la S= ',S);
Readln;
End.
[/quote]
Chạy chương trình trên ta được kết quả là $\text{So cac so thoa man la S= }1644$
_______________________________________________
Qua 3 ví dụ trên, các bạn có thể thấy rằng:
Ta dùng vòng lặp for ... to ...do liên tiếp cho mọi biến, cho đến khi điều kiện logic được thoả (yêu cầu của đề bài)
Ta phải "giải thích" cho ngôn ngữ PASCAL hiểu cái yêu cầu đó bằng ngôn ngữ logic and (và) or (hoặc)
not (phủ định), ...
Bài viết sau tôi sẽ post lên các bài tập cho các bạn tự luyện.

#2
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
Bài toán 4: Vé xe hạnh phúc:
- Một vé xe buýt bất kỳ có mã số là một dãy gồm $6$ số tự nhiên, được gọi là vé xe hạnh phúc nếu tổng của $3$ chữ số đầu bằng tổng của $3$ chữ số cuối. Tính xem có tất cả bao nhiêu vé xe hạnh phúc.

Bài toán 5: (Câu VIIb - Đề thi thử số 2 - VMF)
- Cho tập $A=\{0,1,2,5,7,8\}$. Có bao nhiêu số tự nhiên chia hết cho 6, có đúng 5 chữ số, được chọn từ tập $A$

Bài toán 6:
- Cho tập $A=\{0,1,2,4,7,8,9\}$. Có bao nhiêu số tự nhiên nhỏ hơn 80000 mà chia hết cho 3, có các chữ số được chọn từ tập $A$

Bài toán 7:
- Cho tập $A=\{0,1,2\}$. Có bao nhiêu số tự nhiên có đúng $6$ chữ số được tạo thành từ $A$, sao cho số đó có ít nhất một cặp số $0,2$ đứng cạnh nhau.

Bài toán 8:
- Có bao nhiêu số tam giác (số tam giác là số tự nhiên $n$ có dạng $n=\dfrac{k(k+1)}{2}$) lớn hơn $500$ và nhỏ hơn $50000$ ?

#3
E. Galois

E. Galois

    Chú lùn thứ 8

  • Quản lý Toán Phổ thông
  • 3861 Bài viết

Bài toán 4: Vé xe hạnh phúc:
- Một vé xe buýt bất kỳ có mã số là một dãy gồm $6$ số tự nhiên, được gọi là vé xe hạnh phúc nếu tổng của $3$ chữ số đầu bằng tổng của $3$ chữ số cuối. Tính xem có tất cả bao nhiêu vé xe hạnh phúc.

Bài làm

Var a,b,c,d,e,f: shortint;
	   S: longint;
Begin
		 S:=0;
		 for a:=0 to 9 do
		   for b:=0 to 9 do
			 for c:=0 to 9 do
				for d:=0 to 9 do
				  for e:=0 to 9 do
				   for f:=0 to 9 do
					if a + b + c = d + e + f then S:=S+1;
		 Write('So cac so thoa man la S= ',S);
		 Readln;
End.

1) Xem cách đăng bài tại đây
2) Học gõ công thức toán tại: http://diendantoanho...oạn-thảo-latex/
3) Xin đừng đặt tiêu đề gây nhiễu: "Một bài hay", "... đây", "giúp tớ với", "cần gấp", ...
4) Ghé thăm tôi tại 
http://Chúlùnthứ8.vn

5) Xin đừng hỏi bài hay nhờ tôi giải toán. Tôi cực gà.


#4
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
Lưu ý một chút là chữ số đầu tiên của vé xe không nhất thiết khác không đâu E. Galois

#5
E. Galois

E. Galois

    Chú lùn thứ 8

  • Quản lý Toán Phổ thông
  • 3861 Bài viết
OK, tại em ko đọc kĩ đề, em đã sửa, nhưng mà chưa chạy thử pascal

1) Xem cách đăng bài tại đây
2) Học gõ công thức toán tại: http://diendantoanho...oạn-thảo-latex/
3) Xin đừng đặt tiêu đề gây nhiễu: "Một bài hay", "... đây", "giúp tớ với", "cần gấp", ...
4) Ghé thăm tôi tại 
http://Chúlùnthứ8.vn

5) Xin đừng hỏi bài hay nhờ tôi giải toán. Tôi cực gà.


#6
hoangtrong2305

hoangtrong2305

    Trảm phong minh chủ

  • Phó Quản lý Toán Ứng dụ
  • 861 Bài viết

Bài toán 8:
- Có bao nhiêu số tam giác (số tam giác là số tự nhiên $n$ có dạng $n=\dfrac{k(k+1)}{2}$) lớn hơn $500$ và nhỏ hơn $50000$ ?


Nhận xét:

ta có $k$ và $k+1$ là 2 số liên tiếp => $k(k+1)\vdots 2$
Mà $500<n<50000$
=> $32<k<315$

Vậy ta có bài làm như sau:

Hình đã gửi

Kết quả

Hình đã gửi

Vậy có $284$ số tam giác lớn hơn $500$ và nhỏ hơn $50000$

Toán học là ông vua của mọi ngành khoa học.

Albert Einstein

(1879-1955)

Hình đã gửi


-------------------------------------------------------------------------------------------------------------------


Click xem Đạo hàm, Tích phân ứng dụng được gì?

và khám phá những ứng dụng trong cuộc sống


#7
hoangtrong2305

hoangtrong2305

    Trảm phong minh chủ

  • Phó Quản lý Toán Ứng dụ
  • 861 Bài viết

Bài toán 6:
- Cho tập $A=\{0,1,2,4,7,8,9\}$. Có bao nhiêu số tự nhiên nhỏ hơn 80000 mà chia hết cho 3, có các chữ số được chọn từ tập $A$


Số tự nhiên lớn nhất nhưng nhỏ hơn $80000$ là $79999$

vậy ta cho a chạy từ 1 -> 7 và b,c,d,e chạy từ 0 -> 9, điều kiện a,b,c,d,e khác 3;5;6 (do 3;5;6 không có trong tập A)

Thêm điều điện chia hết cho 3 là a+b+c+d+e chia hết cho 3

vậy ta có bài làm sau

Hình đã gửi
Kết quả là

Hình đã gửi

Vậy có $3201$ số chia hết cho 3 mà nhỏ hơn $80000$, được chọn từ tập A

Bài viết đã được chỉnh sửa nội dung bởi hoangtrong2305: 26-12-2011 - 12:36

Toán học là ông vua của mọi ngành khoa học.

Albert Einstein

(1879-1955)

Hình đã gửi


-------------------------------------------------------------------------------------------------------------------


Click xem Đạo hàm, Tích phân ứng dụng được gì?

và khám phá những ứng dụng trong cuộc sống


#8
hoangtrong2305

hoangtrong2305

    Trảm phong minh chủ

  • Phó Quản lý Toán Ứng dụ
  • 861 Bài viết

Bài toán 7:
- Cho tập $A=\{0,1,2\}$. Có bao nhiêu số tự nhiên có đúng $6$ chữ số được tạo thành từ $A$, sao cho số đó có ít nhất một cặp số $0,2$ đứng cạnh nhau.


Câu này e ko chắc với ý tưởng của mình

do 0 và 2 đứng cạnh nhau nên tổng của chúng bằng 2, ngoài ra trong tập A, ngoài 0 và 2 thì không còn số nào có tổng bằng 2 nên ta có bài làm sau

Hình đã gửi

Kết quả là

Hình đã gửi

Vậy đáp số là $422$ số thoả mãn đề bài

Toán học là ông vua của mọi ngành khoa học.

Albert Einstein

(1879-1955)

Hình đã gửi


-------------------------------------------------------------------------------------------------------------------


Click xem Đạo hàm, Tích phân ứng dụng được gì?

và khám phá những ứng dụng trong cuộc sống


#9
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
1+1= mấy hả em?
Tuy nhiên lời giải của em gần chính xác rồi
điều kiện đối với 2 số liên tiếp phải là: $\fbox{(a+b=2) and (a<>b)}$

#10
hoangtrong2305

hoangtrong2305

    Trảm phong minh chủ

  • Phó Quản lý Toán Ứng dụ
  • 861 Bài viết

1+1= mấy hả em?
Tuy nhiên lời giải của em gần chính xác rồi
điều kiện đối với 2 số liên tiếp phải là: $\fbox{(a+b=2) and (a<>b)}$


sr thầy :D e wên cái đề cho phép các số giống nhau

Toán học là ông vua của mọi ngành khoa học.

Albert Einstein

(1879-1955)

Hình đã gửi


-------------------------------------------------------------------------------------------------------------------


Click xem Đạo hàm, Tích phân ứng dụng được gì?

và khám phá những ứng dụng trong cuộc sống


#11
hoangtrong2305

hoangtrong2305

    Trảm phong minh chủ

  • Phó Quản lý Toán Ứng dụ
  • 861 Bài viết

Bài làm

Var a,b,c,d,e,f: shortint;
	   S: longint;
Begin
		 S:=0;
		 for a:=0 to 9 do
		   for b:=0 to 9 do
			 for c:=0 to 9 do
				for d:=0 to 9 do
				  for e:=0 to 9 do
				   for f:=0 to 9 do
					if a + b + c = d + e + f then S:=S+1;
		 Write('So cac so thoa man la S= ',S);
		 Readln;
End.


a thế ơi, bài của a có vấn đề ở khúc if a + b + c = d + e + f then S:=S+1;
khi lập trình trong pascal, pascal sẽ ưu tiên phần so sánh trước rồi mới tới cộng trừ sau, tức thay vì nó cộng 2 vế như ý muốn của a thì nó đi so sánh $c=d$ vì thế nên phần mềm sẽ báo lỗi.

Theo e khúc đó nên viết thành if (a + b + c) = (d + e + f) then S:=S+1;

thì pascal sẽ ưu tiên phần trong ngoặc rồi mới bắt đầu so sánh, lúc này máy sẽ chạy đúng với ý tưởng của a :D

Write('So cac so thoa man la S= ',S); theo e thì nên viết thành Write('So cac so thoa man la S= ',S:3);

thật ra phần này ko bắt buộc, nhưng nếu sử dụng S thì kết quả ra dạng 3.00000000000000E+0000, rất xấu, nếu viết S:3 thì máy hiển thị là 3, dễ nhìn hơn :D

Toán học là ông vua của mọi ngành khoa học.

Albert Einstein

(1879-1955)

Hình đã gửi


-------------------------------------------------------------------------------------------------------------------


Click xem Đạo hàm, Tích phân ứng dụng được gì?

và khám phá những ứng dụng trong cuộc sống


#12
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
Em lại nhầm!
Kết quả của S: (kiều số nguyên lớn longint) làm gì có phần thập phân đâu?
Nên S:3 là thừa!
Còn về việc so sánh logic phải viết đúng như em nói, thậm chí nếu nhiều hơn một điều kiện thì phải viết $\fbox{if ((a+b+c)=(d+e+f)) and (...)}$
biểu thức logic cần so sánh, đưa vào ngoặc sẽ chính xác hơn.

#13
zipienie

zipienie

    Thiếu úy

  • Thành viên
  • 533 Bài viết

Đây là một topic hay, Pascal quả thật là một ngôn ngữ rất tuyệt vời và rất thích hợp cho những bạn học sinh, sinh viên thích và tìm hiểu về ngôn ngữ lập trình :D

Nhân tiện xin đưa ra một bài toán có thể nói là rất thực tiễn và có khá nhiều ứng dụng trong đời sống hàng ngày

Bài toán:  Cho biết ngày, tháng và năm bất kì tương ứng. Hãy lập trình và cho biết ngày đó là thứ mấy trong tuần ?

 

 


Luận văn, tài liệu tham khảo toán học : http://diendantoanho...ảo/#entry499457

Sách, Luận Văn, Tài liệu tham khảo https://www.facebook...TailieuLuanvan/

#14
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Đây là một topic hay, Pascal quả thật là một ngôn ngữ rất tuyệt vời và rất thích hợp cho những bạn học sinh, sinh viên thích và tìm hiểu về ngôn ngữ lập trình :D

Nhân tiện xin đưa ra một bài toán có thể nói là rất thực tiễn và có khá nhiều ứng dụng trong đời sống hàng ngày

Bài toán:  Cho biết ngày, tháng và năm bất kì tương ứng. Hãy lập trình và cho biết ngày đó là thứ mấy trong tuần ?

 Về bài toán này, thì tính tương đối thì cũng không khó lắm

Em xem thử cái này (bài số #47) để xem có gì hay không nhé! :)



#15
dinhbn

dinhbn

    Lính mới

  • Thành viên
  • 2 Bài viết

có ai rảnh online giúp mình bài toán này vơi hoặc mail cho mình [email protected] nếu đc thanks các bạn nhá

Bài 1
Cho DT1,DT2..DTn và SL1,SL2..SLn là diện tích canh tác và sản lượng tương ứng của N xã trong một huyện.viết chương trình pascanl để nhập dữ liệu tính và in ra năng suất trung bình toàn huyện và tổng sản lượng các xã có năng xuất cao hơn năng xuất trung bình của toàn huyện
Bài 2
Vẽ sơ đồ thuật toán dữ liệu tính và đưa ra số lượng các phần tử có giá trị dưới 50 từ 50 đến 100 của dẫy số gồm phần tử



#16
Quang2002

Quang2002

    Lính mới

  • Thành viên mới
  • 1 Bài viết
Các bạn ơi có ai giúp mình bài này với, gửi qua [email protected] nhe. thanks cac ban
Vân nhận được một món quà chứa trong hộp hình lập phương (hộp bị khoá)
Hộp được khoá như sau: bản thân hộp là một hình lập phương hoàn hảo với lỗ khảm ở mỗi mặt. Gửi kèm với hộp là 6 viên ngọc khớp với lỗ khảm trên mỗi mặt. Hộp chỉ mở ra được nếu được trang trí bằng cách 6 viên ngọc vào đúng vị trí. Hai cách trang trí là như nhau nếu có thể dung phép quay để từ cách này qua cách kia
Hãy giúp Vân mở món quà đó
Yêu cầu: biết màu của mỗi viên ngọc, hỏi trong trường hợp xấu nhất, cần bao nhiêu lần thử để mở được họp? Chú ý, hai viên ngọc cùng màu giống hệt nhau
Dữ liệu: vào từ tập tin văn bản HOPQUA.INP, gồm một dòng duy nhất chứa 6 kí tự cách nhau khoảng trắng lấy từ tập {R,O,Y,G,B,V} đó là màu của 6 viên ngọc
In ra một số nguyên duy nhất là số cách trang trí hộp





Được gắn nhãn với một hoặc nhiều trong số những từ khóa sau: Tổ hợp, Lập trình, Pascal

1 người đang xem chủ đề

0 thành viên, 1 khách, 0 thành viên ẩn danh