Программа ломается после новемсептагинтиллионов (80 в списке). Python виновать или мои кривые руки? Хочу центиллион рублей зарплату.
def ntow(num: int):
result = ''
s = str(num)[::-1]
ten = 0
block_name = {0: '',
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: 'дуосептагинтиллион',
74: 'тресептагинтиллион',
75: 'кваторсептагинтиллион',
76: 'квинсептагинтиллион',
77: 'секссептагинтиллион',
78: 'септенсептагинтиллион',
79: 'октосептагинтиллион',
80: 'новемсептагинтиллион',
90: 'октогинтиллион',
91: 'уноктогинтиллион',
92: 'дуооктогинтиллион',
93: 'треоктогинтиллион',
94: 'кватороктогинтиллион',
95: 'квиноктогинтиллион',
96: 'сексоктогинтиллион',
97: 'септоктогинтиллион',
98: 'октооктогинтиллион',
99: 'новемоктогинтиллион',
100: 'нонагинтиллион',
101: 'уннонагинтиллион',
102: 'дуононагинтиллион',
103: 'тренонагинтиллион',
104: 'кваторнонагинтиллион',
105: 'квиннонагинтиллион',
106: 'секснонагинтиллион',
107: 'септеннонагинтиллион',
108: 'октононагинтиллион',
109: 'новемнонагинтиллион',
110: 'центиллион',
}
digit_name = {1: 'единицы',
2: 'десятки',
3: 'сотни',
}
thousands_endings = {0: '',
1: 'а',
2: 'и',
3: 'и',
4: 'и',
5: '',
}
other_endings = {0: 'ов',
1: '',
2: 'а',
3: 'а',
4: 'а',
5: 'ов',
}
one_thousand = 'одна'
two_thousands = 'две'
other = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять',
'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать',
'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
hundreds = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
tens = ['', 'десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
for i in range(0, len(s), 3):
block = s[i:i+3][::-1]
block = block.rjust(3, '0')
res = ''
for digit in range(len(block), 0, -1):
if digit_name[digit] == 'сотни':
res = hundreds[int(block[0:1])]
res += ' '
if digit_name[digit] == 'десятки':
if int(block[2:3]) == 0 and int(block[1:2]) > 0: # 10 20 30 ...
res += tens[int(block[1:2])]
res += ' '
ten = int(block[1:3])
elif int(block[2:3]) > 0 and int(block[1:2]) == 0: # 01 02 03 04 ...
if block_name[i/3] == 'тысяч' and int(block[2:3]) == 1:
res += one_thousand
elif block_name[i/3] == 'тысяч' and int(block[2:3]) == 2:
res += two_thousands
else:
res += other[int(block[2:3])]
res += ' '
ten = int(block[1:3])
elif int(block[2:3]) > 0 and int(block[1:2]) > 1: # 21 ... 32 ... 43 ...
res += tens[int(block[1:2])]
res += ' '
if block_name[i / 3] == 'тысяч' and int(block[2:3]) == 1:
res += one_thousand
elif block_name[i / 3] == 'тысяч' and int(block[2:3]) == 2:
res += two_thousands
else:
res += other[int(block[2:3])]
res += ' '
ten = int(block[1:3])
elif int(block[2:3]) > 0 and int(block[1:2]) == 1: # 11 12 13 14 ...
res += other[int(block[1:3])]
res += ' '
ten = int(block[1:3])
if block_name[i/3] != '':
if int(block[0:3]) != 0:
res += block_name[i/3]
if block_name[i/3] == 'тысяч' and ten < 6:
res += thousands_endings[ten]
elif block_name[i/3] == 'тысяч' and 5 < ten < 20:
res += thousands_endings[5]
elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
res += thousands_endings[int(str(ten)[1:2])]
elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
res += thousands_endings[5]
elif block_name[i/3] != 'тысяч' and ten < 6:
res += other_endings[ten]
elif block_name[i/3] != 'тысяч' and 5 < ten < 20:
res += other_endings[5]
elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
res += other_endings[int(str(ten)[1:2])]
elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
res += other_endings[5]
res += ' '
result = res + result
result = " ".join(result.split())
result = result.capitalize()
print(result)
if __name__ == '__main__':
ntow(199019225009135673535463434567773456334345634536456345563546456345634564563456345634563345635635463456354602624254523452342893746253445454545445454545454554523465234562983745629834756298347562983475628934756289347562834756283475628934756283475)