Tách 1 số nguyên thành các chữ số và lấy random 1 trong 2 số

Cho e hỏi làm sao để tách 1 số nguyên ví dụ 237 thành 2,3,7 ạ? Với cả lấy random 1 trong 2 số như thế nào ạ?

Đầu tiên, để tách một số nguyên ra hàng đơn vị, chục, trăm, nghìn,…có hai cách:

  1. Chia, cách làm như sau:
    - Hàng đơn vị: n mod 10(mod trong Python, Java, JS,…là %)
    - Hàng chục: n/10 mod 10(lấy số ở hàng chục bằng cách lấy phần nguyên).10
    - Hàng trăm: n/100 mod 10(lấy số ở hàng trăm bằng cách lấy phần nguyên).100
    - Hàng nghìn: n/1000 mod 100(lấy số ở hàng nghìn bằng cách lấy phần nguyên).1000
    - Muốn tách một số nguyên bất kì ra hàng đơn vị, chục, trăm, nghìn,…thì dùng vòng lặp chạy từ 1 đến log(n)(lấy giá trị ở phần nguyên) rồi dùng quy tắc trên.

  2. Chuyển số đó sang chuỗi rồi lấy từng kí tự ra, chuyển các kí tự này ngược trở lại thành số :V

Thứ hai, để lấy random 1 trong 2 số thì cho một biến n(đặt tên gì cũng được), n có giá trị random trong khoảng 0 đến 1. Nếu n = 0 thì lấy số thứ nhất, n = 1 thì lấy số thứ hai.

3 Likes
def num_to_set(n):
    result = Set()
    while n:
        # thêm số hàng đơn vị vào kết quả
    return result

lấy random

from random import choices
x = choices(list(num_to_set(237)))

nhưng mà bài này như bài toán đổi tiền ấy, random là thấy sai rồi.
oops edit dùng set thì chuẩn hơn list, tại vì ko có giá trị trùng

4 Likes

thanks a :3 lần nào post cx đc a chỉ :V

Bài này tách chữ số ra rồi QHĐ từ n về 0 mà :slight_smile:

Cái kiểu này là muốn hàng nào tách hàng đó :smiley: chứ duyệt qua tất cả chữ số thì ko nên.

5 Likes
num = 237
num_as_str = str(num) 
# Chuyển giá trị của num từ một số thành một chuỗi rồi gán vào trong biến num_as_str
num_list = list(map(int, num_as_str))
# Trong python, một chuỗi được xem như một list chứa các kí tự của chuỗi đó. 
# Thông tin về hàm map: https://quantrimang.com/ham-map-trong-python-166188
print(num_list)

P/s: Cách ghi siêu siêu ngắn :penguin::

num_list = list(map(int, str(237)))
print(num_list)

P/s 2: Có thể đổi từ int thành byte để tiết kiệm bộ nhớ :penguin:

2 Likes

mình thích kiểu này hơn:

num =  237
num_list = {int(x) for x in str(num)}
print(num_list)

ko biết hiệu năng thế nào thôi :frowning:

4 Likes

Cho một số nguyên n. Mỗi bước biến đổi, ta có thể trừ n đi một giá trị bằng một trong những chữ số có trong n. Hãy tính số bước tối thiểu để n = 0.

Với bài này, với n có 1 chữ số thì bước biến đổi là 1, nếu > 1 mình nghĩ rằng tìm số lớn nhất trong các chữ số rồi trừ, tiếp tục cho tới khi n chỉ còn 1 chữ số, nhằm giảm số đó nhanh nhất, với TH nếu trừ đi số lớn nhất, chữ số lớn nhất của số sau đó có thể nhỏ nhưng luôn >=, ví dụ 231 trừ đi 3 ra 228, hoặc trừ đi 2 ra 229 đến đây 228 có thể trừ đi 8, 229 có thể trừ đi 9 ra kq = nhau, nhưng lựa chọn trừ đi chữ số lớn nhất vẫn là TH tổng quát nên cài đặt như vậy là OK

6 Likes

Xác định cứ tạo nhiều object là cực lâu :smiley:
bữa mở cái app 30s mới lên hình

4 Likes

@rogp10 Hmmm…Cách của mình thì sao :thinking:?

bài này nếu OP học graph rồi thì tương tự tìm đường ngắn nhất từ 0 đến n thôi


ai pro backtracking chỉ mình với, thuật toán thì mình hiểu được đại khái
mình hiểu là x += 7 nếu x > n thì quay lại trước đó rồi thử x += 3
nhưng cứ đến lúc code thì não như bị crash ấy
chân thành cảm ơn :hugs: :kissing: :kissing_closed_eyes: :kissing_heart:

2 Likes

Ủa, thấy cách giải “tham lam” của bạn @Blue_Manh có vẻ ổn rồi mà.

37 -> 30 -> 27 -> 20 -> 18 -> 10 -> 9 -> 0

Còn đây là python one liner:

f = lambda n, c=0: c if n<=0 else f(n-int(max(str(n))), c+1)

print(f(37))
8 Likes

mình test thử code của bạn

f = lambda n, c=0: c if n<=0 else f(n-int(max(str(n))), c+1)

print(f(37), f(37) == 7)       #37     =   7 * 4 + 3 * 3
print(f(65), f(65) == 11)      #65     =   6 * 10 + 5
print(f(12), f(12) == 6)       #12     =   2 * 6
print(f(150), f(150) == 30)    #150    =   30 * 5

output

7 True
12 False
3 False
27 False
1 Like
37 -> 30 -> 27 -> 20 -> 18 -> 10 -> 9 -> 0

được xài số 8 số 2 gì nữa kìa đâu phải chỉ cho xài 7 và 3 ko đâu :V

Cho một số nguyên n . Mỗi bước biến đổi, ta có thể trừ n đi một giá trị bằng một trong những chữ số có trong n . Hãy tính số bước tối thiểu để n = 0 .

cái đề cũng thật khó hiểu =] Ví dụ 11 thì nếu như chỉ trừ được giá trị 1 trong những chữ số có trong n ban đầu thì phải mất 11 bước, còn chữ số trong n “hiện tại” thì cần 3 bước 11-1=10, 10-1=9, 9-9=0 :V

2 Likes

Bạn xem lại đề cho kĩ nào.

Mình chạy QHĐ ra giống y như trên.

mình làm theo đúng như mình hiểu đề của thớt thì ra như này

def num_to_zero(n):
    digits = {int(x) for x in str(n)}
    result = {}
    result[0] = 0
    for i in range(1, n + 1):
        result[i] = n + 1
    for i in range(n + 1):
        for digit in digits:
            if i >= digit:
                result[i] = min(result[i], 1 + result[i - digit])
    return result[n]

cái quan trong là n - digit rồi thì các chữ số trong n có nên được update lại hay ko :V ví dụ 21 - 2 = 19 thì tiếp theo 19 được phép -1 -9 hay là vẫn phải -2 -1?

3 Likes

@Khanh_Do_Gia ping thớt

vậy cái này đợi OP vào thôi :frowning:

https://codelearn.io/training/detail/1856684 đề đây =]

image

theo kiểu đệ quy kia thì tối đa đệ quy 2n/10 lần vậy tối đa ~200k lần đệ quy chắc ok :V
tối đa 2n/10 lần vì ví dụ abcd thì tệ nhất là phải -d còn abc0, rồi trừ tiếp a/b/c còn ab(c-1)e, mất 2 lần trừ để giảm hàng chục đi 1, vậy mất 2*(n/10) lần để giảm còn n < 10 :V

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