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 ạ?
Tách 1 số nguyên thành các chữ số và lấy random 1 trong 2 số
Đầ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:
-
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. -
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.
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
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à
Cái kiểu này là muốn hàng nào tách hàng đó chứ duyệt qua tất cả chữ số thì ko nên.
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 :
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ớ
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
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
Xác định cứ tạo nhiều object là cực lâu
bữa mở cái app 30s mới lên hình
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
Ủ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))
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
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ó trongn
. 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
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?
vậy cái này đợi OP vào thôi
https://codelearn.io/training/detail/1856684 đề đây =]
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