Sử dụng Python giải bài tập tổ hợp xác suất

Sử dụng Python giải bài tập tổ hợp xác suất

Sau khi đã giải được 20 Bài tập Python cơ bản có lời giải, mời bạn tiếp tục thử sức các bài tập Python chỉ sử dụng vòng lặp và các kiểu dữ liệu cơ bản như kiểu danh sách list, kiểu xâu str.

Bài 1. [Đại học Thái Nguyên 2000] Từ các chữ số 1; 2; 3 có thể lập được bao nhiêu số tự nhiên gồm 5 chữ số có mặt đủ 3 chữ số nói trên?

Đáp số: 150 số.

Hướng dẫn. Đầu tiên sử dụng 5 vòng lặp để tạo một danh sách tất cả các số tự nhiên gồm 5 chữ số được tạo thành từ các chữ số 1, 2, 3. Sau đó duyệt qua tất cả các phần tử của danh sách này và dùng hàm membership in để kiểm tra xem phần tử đó có mặt cả ba chữ số 1, 2, 3 hay không. Nếu có thì tăng biến đếm count, và in phần tử đó ra nếu muốn.

numbers = ['1', '2', '3']
results = []

for a in numbers:
  for b in numbers:
    for c in numbers:
      for d in numbers:
        for e in numbers:
          # results.append([a,b,c,d,e])
          results.append(a+b+c+d+e)

count = 1

for temp in results:
  # print(temp)
  if ('1' in temp) and ('2' in temp) and ('3' in temp):
    print(str(count) +': '+temp)
    count +=1

Bài 2. Có bao nhiêu số tự nhiên gồm 5 chữ số và chia hết cho 7.

Đáp số: 12857 số.

Hướng dẫn. Sử dụng một biến đếm count. Duyệt tất cả các số tự nhiên có 5 chữ số (từ 10000 đến 99999) và kiểm tra xem số đó có chia hết cho 7 hay không. Nếu có thì tăng biến đếm. Có thể in ra số đó nếu muốn.

count = 0
for i in range(10000, 99999 + 1):	
  if (i % 7 == 0):
    count += 1
    print(str(count) + ': ' + str(i))

Bài 3. Một em bé có thể mang họ cha là Nguyễn, hoặc họ mẹ là Lê; tên đệm có thể là Văn, Hữu hoặc Đình; tên có thể là Nhân, Nghĩa, Trí hoặc Dũng. Hỏi có bao nhiêu cách đặt tên cho bé?

Đáp số. Có 24 cách đặt tên.

bien_dem = 1
ho = ['Nguyễn', 'Lê']
dem = ['Văn', 'Hữu', 'Đình']
ten = ['Nhân', 'Nghĩa', 'Trí', 'Dũng']
for h in ho:
  for d in dem:
    for t in ten:
      print(str(bien_dem) + ': ' + h + ' ' + d + ' ' + t)
      bien_dem += 1

Bài 4. [Đại học An Ninh 1997] Từ các chữ số từ 0 đến 6 có thể lập được bao nhiêu số tự nhiên chẵn gồm 3 chữ số khác nhau?

Nếu sử dụng kiểu dữ liệu tập hợp set, chúng ta có thể in trực tiếp ra các số thỏa mãn yêu cầu:

numbers_even = {'0', '2', '4', '6'}
numbers_odd = {'1', '3', '5'}
numbers = numbers_even | numbers_odd

results = []
count = 0

for c in numbers_even:
  for a in (numbers - {'0'}):
    if (a != c):
      for b in numbers:
        if ( b!=a and b!= c):
          count += 1
          print(str(count) + ': ' +a+b+c)

Cách khác, chúng ta không sử dụng kiểu dữ liệu tập hợp thì sẽ in ra rất cả các số tự nhiên chẵn sau đó loại đi các số mà có chữ số giống nhau:

count = 0
results =[]

for a in range(1,7):
  for b in range(0,7):
    for c in {0,2,4,6}:
      results.append(str(a)+str(b)+str(c))

temp = []
for x in results:
  if not((x[0] == x[1]) or (x[0]==x[2]) or (x[1]==x[2])):
    temp.append(x)
print(len(temp))
print(temp)

Bài 5. Từ các chữ số 0,1,2,3,4,5,6 có thể lập được bao nhiêu số tự nhiên gồm 3 chữ số khác nhau và phải có mặt chữ số 5?

Đáp số: 80 số.

count = 0
results =[]

for a in range(1,7):
  for b in range(0,7):
    for c in range(0,7):
      results.append(str(a)+str(b)+str(c))

temp = []
for x in results:
  if not((x[0] == x[1]) or (x[0]==x[2]) or (x[1]==x[2])) and ('5' in x):
    temp.append(x)
print(len(temp))
print(temp)