forked from betich/comp-prog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhw5.py
73 lines (58 loc) · 1.54 KB
/
hw5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def next_partition_number(p, posnums):
m = len(p)
sum = 0
i = 0
sign = 1
while m-posnums[i] >= 0:
if i % 4 == 0 or i % 4 == 1:
sign = 1
if i % 4 == 2 or i % 4 == 3:
sign = -1
sum += p[m-posnums[i]]*sign
i += 1
return sum
def position_numbers(n):
i = 1
a = 1
lst = [1]
while i <= n:
i += a
lst.append(i)
if i <= n:
b = 2*a + 1
i += b
lst.append(i)
a += 1
return lst
def partition(n):
n = int(n)
posnums = position_numbers(n)
p = [1] # p[0] = 1
for m in range(1, n+1):
p += [next_partition_number(p, posnums)]
out = str(p[n])
return out
def find_id_in_num(id, num):
id = str(id)
m = 0
for char in str(num):
if char == id[m]:
m += 1
return m == len(id)
def least_pn_having(x):
"""
รับ x เก็บจำนวนเต็มบวก
คืน partition number ที่มีค่าน้อยสุดที่มีเลขทุกตัวใน x แฝงอยู่ตามลำดับที่ปรากฏใน x
เช่น least_pn_having(12) คืน 1002
least_pn_having(1234567890) คืน 1980769965254371045106648307068906619
"""
m = 0
while True:
p = partition(m)
if find_id_in_num(x, p):
print(m, "=>", p)
break
else:
m += 1
return partition(m)
print(least_pn_having(6430342121))