Bản sao có thể xảy ra:
nth ugly number
Find the Kth least number for expression (2^x)*(3^y)*(5^z)cách tạo số cho các yếu tố chính của chúng, nhưng với số mũ không xác định?
Tôi đang tự hỏi làm thế nào để giải quyết vấn đề này một cách nhanh chóng và thanh lịch:
Chúng ta định nghĩa "xấu xí" mỗi số n có thể được viết dưới dạng: 2^x * 3^y * 5^z ;, trong đó x, y và z là số tự nhiên. Tìm số thứ xấu xí thứ 1500.
Ví dụ: là người đầu tiên con số "xấu xí" là:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...
Tôi đã cố gắng để giải quyết vấn đề này bằng brute-force, theo cách này:
import itertools as it
def is_ugly(n):
'''Return `True` if *n* is an ugly number.'''
if n == 1:
return True
while not n % 2:
n //= 2
while not n % 3:
n //= 3
while not n % 5:
n //= 5
return n == 1
def nth_ugly(n):
'''Return the nth ugly number.'''
num = 0
for i in it.count(1):
if is_ugly(i):
num += 1
if num == n:
return i
Nhưng phải mất khá nhiều thời gian, và tôi muốn tìm một giải pháp nhanh hơn và tốt hơn.
Tôi biết các yếu tố chính của số xấu, nhưng tôi không thể nghĩ ra cách để tạo ra những con số này theo đúng thứ tự.
Tôi nghĩ rằng phải có một cách để tạo ra những con số này mà không cần phải kiểm tra tất cả các con số. Vấn đề là nó có vẻ như số mũ của các yếu tố chính được phân phối khá ngẫu nhiên.
Nhìn vào bảng này:
n |number| x | y | z |
------------------------
1 | 1 | 0 | 0 | 0 |
------------------------
2 | 2 | 1 | 0 | 0 |
------------------------
3 | 3 | 0 | 1 | 0 |
------------------------
4 | 4 | 2 | 0 | 0 |
------------------------
5 | 5 | 0 | 0 | 1 |
------------------------
6 | 6 | 1 | 1 | 0 |
------------------------
7 | 8 | 3 | 0 | 0 |
------------------------
8 | 9 | 0 | 2 | 0 |
------------------------
9 | 10 | 1 | 0 | 1 |
------------------------
10 | 12 | 2 | 1 | 0 |
------------------------
11 | 15 | 0 | 1 | 1 |
------------------------
12 | 16 | 4 | 0 | 0 |
------------------------
13 | 18 | 1 | 2 | 0 |
------------------------
14 | 20 | 2 | 0 | 1 |
------------------------
15 | 24 | 3 | 1 | 0 |
------------------------
Như bạn thấy x, y và z giá trị dường như không tuân theo bất kỳ quy tắc.
Ai đó có thể tìm ra giải pháp cho vấn đề này không?
Tôi đang nghĩ đến việc cố gắng phân chia vấn đề ở các phần khác nhau. Vì vấn đề được xác định bởi sự ngẫu nhiên của số mũ, tôi có thể cố gắng tạo ra độc lập các lũy thừa của 2s, 3s, 5s và sau đó là số của biểu mẫu 2^x * 3^y, 2^x * 5^z v.v. Và cuối cùng đặt chúng lại với nhau, nhưng tôi không biết nếu điều này sẽ giải quyết vấn đề của tôi.
Bài tập về nhà? Phỏng vấn? Tôi đã có một lần này như là một bài tập về nhà, sẽ đăng giải pháp dưới đây. –
theo http://stackoverflow.com/questions/7215315 'Phiên bản thay thế bằng cách sử dụng "Vòng lặp tuần hoàn"' là một giải pháp Python rất đẹp cho bất kỳ ai quyết định đọc giải pháp Python nào trong [trang này] (http: // rosettacode.org/wiki/Hamming_numbers#Alternate_version_using_.22Cyclic_Iterators.22) –
Đó là một vấn đề được đưa ra một vài năm trước trong kỳ thi cho phép truy cập vào Trường Xuất sắc của Udine. Tôi đang chuẩn bị bước vào đó nên tôi đang cố gắng giải quyết các bài kiểm tra trước đó. Tôi xin lỗi về bản sao, ngay cả khi ngôn ngữ lập trình khác ... Tôi chỉ không thử "những con số xấu xí" bởi vì tôi nghĩ đó chỉ là một tên ngẫu nhiên được phát minh bởi tác giả của bài kiểm tra. – Bakuriu