Trả về số nguyên tố nhỏ nhất được tạo ra từ xâu s

Cho xâu s là xâu chỉ chứa các ký tự trong bảng chữ cái. Từ xâu s bạn có thể tạo ra nhiều số tự nhiên bằng cách thay các ký tự trong s bằng các số bất kỳ với mỗi ký tự chỉ tương ứng với một số duy nhất và số được tạo ra không bắt đầu bằng chữ số 0.

Ví dụ:

  • Với s = "aba" thì bạn có thể tạo ra các số 121, 212, 373, ...
  • Với s = "cbba" thì bạn có thể tạo ra các số 2334, 5661, 1223, ...
  • Với s = "uu" thì bạn có thể tạo ra các số 11, 22, 33, ...
  • Với s = "ab" thì bạn không thể tạo ra các số 11, 22, 33, 44, ... do ab tương ứng với 2 số khác nhau.
  • Với s = "abc" thì bạn không thể tạo ra các số 012, 089, 043, ... do số được tạo ra không được có số 0 ở đầu.

Hãy viết hàm trả về số nguyên tố nhỏ nhất được tạo ra từ xâu s biết số nguyên tố là số nguyên dương mà chỉ có 2 ước số nguyên dương là 1 và chính nó. Nếu từ s không thể tạo ra được số nguyên tố thì trả về -1 .

Duyệt chỉnh hợp nhé :slight_smile: mỗi chỉnh hợp thay số vào và quay RM thử.

3 Likes

bạn có thể nói rõ hơn không ạ?

Đầu tiên bạn cần tìm hiểu cách sinh tổ hợp, chỉnh hợp :slight_smile:

3 Likes

sau khi tìm hiểu cách sinh tổ hợp, chỉnh hợp thì sao ạ?

Thì đây, bạn phải đọc hết comment của bạn ấy đã.

2 Likes

dạ vâng, nhưng cho em hỏi quay RM là gì thế?

Là dùng Rabin - Miller để kiểm tra tính nguyên tố.

2 Likes

Yếu thì mới phải tự code cho khỏe lên nhé. :smirk:

2 Likes

bạn cho mình xin hướng giải chi tiết được không ạ? :frowning: :frowning: :frowning:

Bạn còn muốn chi tiết tới mức nào nữa?

Chỉ có mỗi vậy thôi mà. :expressionless:

  1. Liệt kê các chỉnh hợp ứng với sâu s.

  2. Thay số với mỗi chỉnh hợp và kiểm tra xem số đó có phải là snt hay không.

  3. Nếu là snt thì kiếm tra xem đó có phải là số nguyên tố nhỏ nhất trong các chỉnh hợp được liệt kê hay không, có thì trả về nó, còn không có snt nào thì trả về -1.

Và đó là những điều mà anh Rogp10 đã nói ở trên rồi. :no_mouth:

1 Like

Không, code hộ bạn mình được gì đâu. :smirk:

Và quan trọng hơn tất cả các bước trên thì tài liệu trên mạng đều có nhé. :V :V

1 Like

cho mình xin một số tài liệu được không ạ :sweat: :sweat:

Đầu tiên phải xử lý vài việc trước đã. Đếm số lượng chữ cái khác nhau trong sâu s, đếm được k chữ cái khác nhau, k phải nhỏ hơn hoặc bằng 10, vì chỉ có 10 chữ số khác nhau. :stuck_out_tongue:

Giờ việc của bạn là liệt kê chỉnh hợp chập k của n phần tử. <- gg y nguyên như v luôn, hoặc đọc trong cuốn Lập trình và Giải thuật - LMH, ở ý 3.3 phần 1.

Chú ý là phần tử đầu phải khác 0, n bằng 10.


Các bước sau mình tin rằng bạn có thể làm được r. :smiley:

3 Likes

cảm ơn bạn nhiều lắm :grin: :grin: :grin:

Không hẳn :slight_smile:

Nó ntn:

# pseudo
pattern = s
pb = pattern.chars
a = pb.uniq
return -1 if a.empty? or a.length > 10
generator = Permutation.new(10, a.count, [1,0,2,3,4,5,6,7,8,9])
# dùng lambda để thoát khỏi hàm gọi nó luôn.
generator.each do { |c|
   # dịch từ pattern đã thu gọn (là a) ra số trong mảng c
   num = pb.translate(str.maketrans(a, c)).join.to_i
   # thay vì join thì: num = num.reduce(0) do |r, v| r*10+v end
   if num.prime? : print(num); return; end
}
print -1
4 Likes

Đây là ngôn ngữ gì vậy ạ?

translate với maketrans là Python :slight_smile:

p/s: bài này ko phải tổ hợp… mà là chỉnh hợp.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?