|
发表于 2018-3-20 22:50:57
From FishC Mobile
|
显示全部楼层
本帖最后由 Chase_Kas 于 2018-4-4 22:16 编辑
利用递归写了一个数字转换大数的程序,支持10**64-1的数字转换嘿嘿嘿~
- class Fib:
- def __init__(self, maxnum):
- self.a, self.b, self.maxnum = 0, 1, maxnum
-
- def __iter__(self):
- return self
- def __next__(self):
- self.a, self.b = self.b, self.a+self.b
- if self.a > self.maxnum:
- raise StopIteration
- return numerals(self.a)
- def numerals(num):
- # 采用上位计数法。即一万万为亿,一亿亿为兆,一兆兆为京。
- upper_numer = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
- string = ''
-
- # 把数字转换为大写,为零的位数就记为零,在后续进行处理。(例如:100001(0010001)记为零零一十万零零零一)
- if num < 10**4:
- unit = ['千', '百', '十', '']
- for i in range(4):
- each = num//(10**(3-i))
- num %= (10**(3-i))
- if each:
- string += upper_numer[each] + unit[i]
- else:
- string += upper_numer[0]
- elif num < 10**8:
- string += (numerals(num//10**4)+'万'+numerals(num%10**4))
- elif num < 10**16:
- string += (numerals(num//10**8)+'亿'+numerals(num%10**8))
- elif num < 10**32:
- string += (numerals(num//10**16)+'兆'+numerals(num%10**16))
- elif num < 10**64:
- string += (numerals(num//10**32)+'京'+numerals(num%10**32))
- else:
- raise OverflowError
-
- # 把多余的零去掉。(例如:把'零零一十万零零零一'处理为'零一十万零一')
- while True:
- if string.find('零零') != -1:
- string = string.replace('零零', '零')
- else:
- break
-
- # 把首尾的零去掉。
- if len(string) > 1:
- if string[0] == '零':
- string = string[1:]
- if string[-1] == '零':
- string = string[:-1]
-
- # 把处于开头的'一十'处理为'十'。
- if string[0:2] == '一十':
- string = string[1:]
-
- return string
- fib = Fib(10**4)
- for i in fib:
- print(i)
复制代码 |
|