鱼C论坛

 找回密码
 立即注册
查看: 3705|回复: 27

[技术交流] Python:每日一题 168

[复制链接]
发表于 2018-3-20 22:50:57 From FishC Mobile | 显示全部楼层
本帖最后由 Chase_Kas 于 2018-4-4 22:16 编辑

利用递归写了一个数字转换大数的程序,支持10**64-1的数字转换嘿嘿嘿~
  1. class Fib:
  2.     def __init__(self, maxnum):
  3.         self.a, self.b, self.maxnum = 0, 1, maxnum
  4.         
  5.     def __iter__(self):
  6.         return self

  7.     def __next__(self):
  8.         self.a, self.b = self.b, self.a+self.b
  9.         if self.a > self.maxnum:
  10.             raise StopIteration
  11.         return numerals(self.a)

  12. def numerals(num):
  13.     # 采用上位计数法。即一万万为亿,一亿亿为兆,一兆兆为京。
  14.     upper_numer = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  15.     string = ''
  16.    
  17.     # 把数字转换为大写,为零的位数就记为零,在后续进行处理。(例如:100001(0010001)记为零零一十万零零零一)
  18.     if num < 10**4:
  19.         unit = ['千', '百', '十', '']
  20.         for i in range(4):
  21.             each = num//(10**(3-i))
  22.             num %= (10**(3-i))
  23.             if each:
  24.                 string += upper_numer[each] + unit[i]
  25.             else:
  26.                 string += upper_numer[0]
  27.     elif num < 10**8:
  28.         string += (numerals(num//10**4)+'万'+numerals(num%10**4))
  29.     elif num < 10**16:
  30.         string += (numerals(num//10**8)+'亿'+numerals(num%10**8))
  31.     elif num < 10**32:
  32.         string += (numerals(num//10**16)+'兆'+numerals(num%10**16))
  33.     elif num < 10**64:
  34.         string += (numerals(num//10**32)+'京'+numerals(num%10**32))
  35.     else:
  36.         raise OverflowError
  37.    
  38.     # 把多余的零去掉。(例如:把'零零一十万零零零一'处理为'零一十万零一')
  39.     while True:
  40.         if string.find('零零') != -1:
  41.             string = string.replace('零零', '零')
  42.         else:
  43.             break
  44.         
  45.     # 把首尾的零去掉。
  46.     if len(string) > 1:
  47.         if string[0] == '零':
  48.             string = string[1:]
  49.         if string[-1] == '零':
  50.             string = string[:-1]
  51.         
  52.     # 把处于开头的'一十'处理为'十'。
  53.     if string[0:2] == '一十':
  54.         string = string[1:]
  55.         
  56.     return string

  57. fib = Fib(10**4)
  58. for i in fib:
  59.     print(i)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-23 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表