鱼C论坛

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

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

[复制链接]
发表于 2018-3-20 21:41:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-3-23 19:29 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

@大头目 和 @天圆突破 先后给我发来了题目,由于难度都不大,考虑再三,把两个题目合二为一,形成一个新题目。
@大头目 的题目:
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值。写一个生成斐波那契数列Fib的类,可以作用于for循环:
  1. >>> fib = Fib()
  2. >>> for i in fib:
  3.         if i > 500:
  4.                 break
  5.         print(i)

  6.        
  7. 1
  8. 1
  9. 2
  10. 3
  11. 5
  12. 8
  13. 13
  14. 21
  15. 34
  16. 55
  17. 89
  18. 144
  19. 233
  20. 377
复制代码

也可以用next调用:

  1. >>> fib = Fib()
  2. >>> next(fib)
  3. 1
  4. >>> next(fib)
  5. 1
  6. >>> next(fib)
  7. 2
  8. >>> next(fib)
  9. 3
  10. >>> next(fib)
  11. 5
复制代码


@天圆突破 的题目:

我相信从学习python开始,大家就没离开过各种打印素数的练习。那今天仍旧是一个打印素数的题目。
要求:持续打印100000(十万)以内所有的素数,但要符合下面的要求:
1. 在打印开始前,有个开关,按照用户的输入选择以数字的形式显示,或者以汉字的形式显示;
2. 汉字显示时,要符合汉字的习惯,例如:
    11 要打印为“十一”
    111 要打印为“一百一十一”
    101 要打印为“一百零一”
    10001 要打印为“一万零一”
    10101 要打印为“一万零一百零一”
    10 要打印为“十”,10000要打印为“一万”(这一条不做硬性要求,因为明显没有这样的素数,但可以作为自我约束)

综合两人的题目,要求以 @大头目 题目为基础,写一个迭代的类,生成斐波那契数列,但输出为中文数字。
为了简化题目,斐波那契数列的最大数字限制在1万以内。

请@大头目 和 @天圆突破 多跟一帖,用于奖励评分。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 22:51:18 | 显示全部楼层
本帖最后由 溯影 于 2018-3-20 23:05 编辑


  1. class Fib:
  2.         def __init__(self):
  3.                 self.a = 0
  4.                 self.b = 1
  5.         def __next__(self):
  6.                 self.a, self.b = self.b, self.a + self.b
  7.                 return self.a
  8.         def __iter__(self):
  9.                 return self


  10. def transform(number):
  11.         str1 = '零一二三四五六七八九'
  12.         if number < 10:
  13.                 return str1[number]
  14.         if number == 10:
  15.                 return '十'
  16.         if number < 100 and number > 10:
  17.                 if number % 10 == 0:
  18.                         return str1[number//10] + '十'
  19.                 else:
  20.                         if number // 10 == 1:
  21.                                 return '十' + str1[number%10]
  22.                         else:
  23.                                 return str1[number//10]+'十' + str1[number%10]

  24.         if number >= 100 and number < 1000:
  25.                 if number % 100 == 0:
  26.                         return str1[number//100] + '百'
  27.                 elif number % 10 == 0:
  28.                         return str1[number//100] + '百' + str1[number//10%10] + '十'
  29.                 else:
  30.                         return str1[number//100] + '百' + str1[number//10%10] + '十' + str1[number%10]
  31.         if number >= 1000 and number < 10000:
  32.                 if number % 1000 == 0:
  33.                         return str1[number//1000] + '千'
  34.                 elif number % 100 == 0:
  35.                         return str1[number//1000] + '千' + str1[number//100%10] + '百'
  36.                 elif number % 10 == 0:
  37.                         return str1[number//1000] + '千' + str1[number//100%10] + '百' + str1[number//10%10] + '十'
  38.                 else:
  39.                         return str1[number//1000] + '千' + str1[number//100%10] + '百' + str1[number//10%10] + '十' + str1[number%10]

  40. if __name__ == '__main__':
  41.         fib = Fib()
  42.         for i in fib:
  43.                 if i > 10000:
  44.                         break
  45.                 print(transform(i))

  46.         print('#################')
  47.         print('next函数')
  48.         fib1 = Fib()
  49.         print(transform(next(fib1)))
  50.         print(transform(next(fib1)))
  51.         print(transform(next(fib1)))
  52.         print(transform(next(fib1)))
  53.         print(transform(next(fib1)))

  54. 运行结果:







  55. 十三
  56. 二十一
  57. 三十四
  58. 五十五
  59. 八十九
  60. 一百四十四
  61. 二百三十三
  62. 三百七十七
  63. 六百一十
  64. 九百八十七
  65. 一千五百九十七
  66. 二千五百八十四
  67. 四千一百八十一
  68. 六千七百六十五
  69. #################
  70. next函数






  71. ***Repl Closed***


复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 23:24:43 | 显示全部楼层
本帖最后由 纳兰小寒 于 2018-3-20 23:34 编辑
  1. 对迭代和构造器是一种懵逼的状态
  2. 也不知道对不对

  3. str_num = ['零','一','二','三','四','五','六','七','八','九']
  4. str_nuit = ['','十','百','千','万','十','百','千']

  5. def fib(): # 生成器函数 - 斐波那契
  6.     a, b, = 0, 1
  7.     c = '零'
  8.     while True:
  9.         if a > 100000:
  10.             return
  11.         yield c
  12.         a, b = b, a + b
  13.         d = ''
  14.         n, s= len(str(a)), str(a)
  15.         if n >=2 and a % 10 == 0:
  16.             d = str_num[int(s[0])] + str_nuit[n - 1]
  17.         else:
  18.             for x in s:
  19.                 if int(x) == 0:
  20.                     d += str_num[int(x)]
  21.                 else:
  22.                     d += str_num[int(x)] + str_nuit[n - 1]
  23.                 n -= 1
  24.         c = d
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 23:51:24 | 显示全部楼层
class Fib():
    def __init__(self):
        self.a=1
        self.b=1
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        return self.a

def hanhua(i):
    ss=['1','','十','百','千','万','十万']
    zd={1:'一',2:'二',3:'三',4:'四',5:'五',6:'六',7:'七',8:'八',9:'九',0:'零'}
    sss=''
    st=str(i)
    while st !='' :
        if int(st[0])!=0:
            sss+=zd[int(st[0])]+ss[len(st)]
        else:
            sss+='零'
        st=st[1:]
    a=sss.find('零零')
    while a!=-1:
        sss=sss[:a]+sss[a+1:]
        a=sss.find('零零')
    while sss[len(sss)-1]=='零':
        sss=sss[:len(sss)-1]
    return sss
   

ff=Fib()
for i in ff :
    xz=input("中文选 1,数字选 2 : ")
    if i>100000 :
        break
    if xz=='1' :
        print(hanhua(i))
    else :
        print(i)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 09:57:18 | 显示全部楼层
class Fib(object):
        def __init__(self):
                self.a, self.b = 0, 1 # 初始化两个计数器a,b
       
        def __iter__(self):
                return self # 实例本身就是迭代对象,故返回自己
       
        def __next__(self):
                self.a, self.b = self.b, self.a + self.b # 计算下一个值
                if self.a > 10000: # 退出循环的条件
                        raise StopIteration()
                return self.a # 返回下一个值
       


string = '零一二三四五六七八九'
fib = Fib()
for i in fib:
        print(i)
        if i < 10:
                output = string[i]
        elif 10 <= i < 100:
                if i//10 == 1:
                        output = '十' + string[i%10]
                else:
                        output = string[i//10] + '十' + string[i%10]
        elif 100 <= i < 1000:
                output = string[i//100] + '百'
                if (i%100)//10 == 0:
                        output += '零'
                elif (i%100)//10 == 1:
                        output += '十'
                else:
                        output += string[(i%100)//10] + '十'
                if i%10 != 0:
                        output += string[i%10]
        elif 1000 <= i < 10000:
                output = string[i//1000] + '千'
                output += string[(i%1000)//100] + '百'
                if (i%100)//10 == 0:
                        output += '零'
                elif (i%100)//10 == 1:
                        output += '十'
                else:
                        output += string[(i%100)//10] + '十'
                if i%10 != 0:
                        output += string[i%10]
        elif i > 10000:
                break
        print(output)

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-3-21 10:03:06 | 显示全部楼层
  1. class Fib():
  2.     def __init__(self):
  3.         self.a, self.b = 0, 1  #初始化两个计数器a,b
  4.         
  5.     def __iter__(self):
  6.         return self  #实例本身就是迭代对象,返回自己

  7.     def __next__(self):
  8.         self.a, self.b = self.b, self.a + self.b
  9.         ss = dict(zip([str(x) for x in range(11)], ['', '一', '二', '三', '四', '五',\
  10.                                               '六', '七', '八', '九']))
  11.         if self.a < 10:
  12.             print(ss[str(self.a)])
  13.         elif 10 <= self.a < 100:
  14.             print(ss[str(self.a)[0]], '十 ', ss[str(self.a)[1]])
  15.         elif self.a == 100:
  16.             print('一百')
  17.         elif 100 < self.a < 110:
  18.             print(ss[str(self.a)[0]], '百零', ss[str(self.a)[2]])
  19.         elif 110 <= self.a < 1000:
  20.             print(ss[str(self.a)[0]], '百', ss[str(self.a)[1]], '十', ss[str(self.a)[2]])
  21.         elif 1000 <= self.a < 1010:
  22.             print(ss[str(self.a)[0]], '千零', ss[str(self.a)[3]])
  23.         elif 1010 <= self.a < 1100:
  24.             print(ss[str(self.a)[0]], '千零', ss[str(self.a)[2]], '十', ss[str(self.a)[3]])
  25.         elif 1100 < self.a < 10000:
  26.             print(ss[str(self.a)[0]], '千','零'*(ss[str(self.a)[1]] == 0),\
  27.                   ss[str(self.a)[2]],'百', '零'*(ss[str(self.a)[2]] == 0 and ss[str(self.a)[1]] != 0),\
  28.                   '十', ss[str(self.a)[3]])
  29.         
  30.         return self.a
  31.    
  32. fib = Fib()
  33. for i in fib:
  34.         if i > 10000:
  35.                 break
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 10:43:34 | 显示全部楼层
def fab(n) :
    a,b=0,1
    result = []
    result.append(1)
    while b < n :
        a,b = b,a+b
        if b < n :
            result.append(b)
    return result


def hz(x) :
    if x==1 :
        return '一'
    elif x==2 :
        return '二'
    elif x==3 :
        return '三'
    elif x==4 :
        return '四'
    elif x==5 :
        return '五'
    elif x==6 :
        return '六'
    elif x==7 :
        return '七'
    elif x==8 :
        return '八'
    elif x==9 :
        return '九'
    else :
        return ''

def weishu(ln) :
    if ln==2 :
        return '十'
    elif ln==3 :
        return '百'
    elif ln==4 :
        return '千'
    elif ln==5 :
        return '万'
    elif ln==1 :
        return ''
    else :
        return 'Unkonw'



result = fab(10000)
print(result)
for i in result :
    v_str=str(i)
    v_len=len(v_str)
    print(str(len(v_str)))
    lista = list(v_str)
    if v_len==2 and lista[0]=='1':
        a='十'+hz(int(lista[xx]))
    else :
        xx = 0
        a=''
        while xx < len(v_str):
            a=a+hz(int(lista[xx]))+weishu(v_len-xx)
            xx = xx+1
    print(i)
    print(a)
   

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 10:55:39 | 显示全部楼层
  1. class Fib:
  2.     def __init__(self):
  3.         self.x =0
  4.         self.y =1
  5.     def __iter__(self):
  6.         return self
  7.     def __next__(self):
  8.         self.x, self.y = self.y, self.x + self.y
  9.         return self.x

  10. def digit2str(n):
  11.     digit_str = ' 一二三四五六七八九'
  12.     if n < 10:
  13.         return digit_str[n]
  14.     elif n < 20:
  15.         return '十' + digit_str[n%10]
  16.     elif n < 100:
  17.         return digit_str[n//10] + '十' + digit_str[n%10]
  18.     elif n < 1000:
  19.         a = n//100      #百位
  20.         b = (n//10)%10  #十位
  21.         c = n%10        #个位
  22.         if b == 0:
  23.             if c:
  24.                 return digit_str[a] + '百零' + digit_str[c]
  25.             else:
  26.                 return digit_str[a] + '百'   
  27.         else:
  28.             return digit_str[a] + '百' + digit_str[b] + '十' + digit_str[c]
  29.     else:
  30.         a = n//1000     #千位
  31.         b = (n//100)%10 #百位
  32.         c = (n//10)%10  #十位
  33.         d = n%10        #个位
  34.         if b == 0 and c == 0:
  35.             if d:
  36.                 return digit_str[a] + '千零' + digit_str[d]
  37.             else:
  38.                 return digit_str[a] + '千'      
  39.         elif b == 0 and c != 0:
  40.             if d:
  41.                 return digit_str[a] + '千零' + digit_str[c] + '十' + digit_str[d]
  42.             else:
  43.                 return digit_str[a] + '千零' + digit_str[c] + '十'
  44.         elif b != 0 and c == 0:
  45.             if d:
  46.                 return digit_str[a] + '千' + digit_str[b] + '百零' + digit_str[d]
  47.             else:
  48.                 return digit_str[a] + '千' + digit_str[b] + '百'
  49.         else:
  50.             return digit_str[a] + '千' + digit_str[b] + '百' + digit_str[c] + '十' + digit_str[d]
  51.    
  52. fib = Fib()
  53. for i in fib:
  54.     if i > 10000:
  55.         break
  56.     else:
  57.         print(digit2str(i))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 10:58:11 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-21 12:28 编辑

加了点难度,支持10**28-1以内的数字转换,汉字数字好像只能这么大,再大就没有单位了。
  1. import re

  2. class Hanzi:
  3.     def __init__(self):
  4.         pass

  5.     def _change(self, s):
  6.         def inner(num):
  7.             if num == 0:
  8.                 return ''
  9.             else:
  10.                 lst = list('千百十')
  11.                 dct = dict(zip([str(i) for i in range(10)], list('零一二三四五六七八九')))
  12.                 num = [dct[i] for i in list(str(num))]
  13.                 num[0] = (len(num) != 2 or num[0] != '一') * num[0]
  14.                 n = len(num)
  15.                 if n <= 4:
  16.                     for i in range(n - 1, 0, -1):
  17.                         num.insert(i, (num[i - 1] != '零') * lst[i + 3 - n])
  18.                     num = re.sub('零+', '零', ''.join(num))
  19.                     if num[-1] == '零':
  20.                         num = num[:-1]
  21.                 return num
  22.         jin = ['', '万', '亿', '兆', '京', '垓', '秭']
  23.         if s > 10 ** 28 - 1:
  24.             return s
  25.         else:
  26.             s, slst, i = str(s), list(), 1
  27.             while s != '':
  28.                 slst.append(int(s[-4:]))
  29.                 s = s[:-4]
  30.             s = list()
  31.             for i in range(len(slst)):
  32.                 if slst[i] == 0:
  33.                     s.insert(0, '零')
  34.                 elif len(slst) == 1:
  35.                     s.insert(0, inner(slst[i]))
  36.                 elif 0 < slst[i] < 1000 and i != len(slst) - 1:
  37.                     s.insert(0, '零' + inner(slst[i]) + jin[i])
  38.                 else:
  39.                     s.insert(0, inner(slst[i]) + jin[i])
  40.             return re.sub('零+', '零', ''.join(s))

  41.     def __call__(self, func):
  42.         def _call(arg):
  43.             res = func(arg)
  44.             return self._change(res)
  45.         return _call




  46. class Fib:
  47.     def __init__(self):
  48.         self.a , self.b = 0, 1

  49.     def __iter__(self):
  50.         return self

  51.     @Hanzi()
  52.     def __next__(self):
  53.         while True:
  54.             self.a , self.b = self.b, self.a + self.b
  55.             return self.a
复制代码

  1. if __name__ == '__main__':
  2.     fib = Fib()
  3.     while True:
  4.         print(next(fib))
  5.         input()
复制代码


fib1.jpg fib2.jpg

大于10**28-1就只能显示数字了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 10:59:10 | 显示全部楼层
领奖励

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 12:29:57 | 显示全部楼层
本帖最后由 8306最硬 于 2018-3-21 19:41 编辑
  1. class Fib():
  2.     def __init__(self):
  3.         self.a, self.b = 0, 1
  4.     def __iter__(self):
  5.         return self   
  6.     def __next__(self):
  7.         self.a, self.b = self.b, self.a + self.b
  8.         if self.a > 10000:
  9.             raise StopIteration
  10.         return self.int2ch(self.a)
  11.    
  12.     def int2ch(self, n):
  13.         ch, unit = '零一二三四五六七八九', ' 十百千万'
  14.         s = ''.join( unit[i] + ch[int(j)] for i, j in enumerate(str(n)[::-1]) ).lstrip()[::-1]
  15.         if 9 < n < 20: s = s[1:3]
  16.         return s if n % 10 else s[:-1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 13:26:08 | 显示全部楼层
本帖最后由 graceasyi 于 2018-3-21 17:48 编辑

[code]class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1   

    def __iter__(self):
        return self            

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b  
        return self.a           


# 由于题目最大的数是4位数,因此这里只处理了不超过4位正整数的情况。
def num_to_chi(n):
    chi = ['十', '一', '二', '三', '四', '五', '六', '七', '八', '九', '零', '百', '千']

    gw = n % 10
    sw = (n % 100) // 10
    bw = (n % 1000) // 100
    qw = n // 1000

    if qw:
        out_q = chi[qw] + chi[12]
    else:
        out_q = ''

    if bw:
        out_b = chi[bw] + chi[11]
    elif qw and not bw:
        out_b = chi[10]
    else:
        out_b = ''

    if sw:
        if not qw and not bw and sw == 1:               # 处理13这样的数
            out_s = chi[0]
        else:
            out_s = chi[sw] + chi[0]
    elif bw and not sw and gw:
        out_s = chi[10]
    else:
        out_s = ''

    if gw:
        out_g = chi[gw]
    else:
        out_g = ''

    return out_q + out_b + out_s + out_g



fib = Fib()
for n in fib:
    if n > 10000:
        break
    print(num_to_chi(n))

结果:






十三
二十一
三十四
五十五
八十九
一百四十四
二百三十三
三百七十七
六百一十
九百八十七
一千五百九十七
二千五百八十四
四千一百八十一
六千七百六十五

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 14:24:53 | 显示全部楼层
  1. #-*- coding:UTF-8 -*-
  2. class Fib:
  3.     def __init__(self,n):
  4.         self.a =0
  5.         self.b=1
  6.         self.n=n
  7.     def __iter__(self):
  8.         return self
  9.     def __next__(self):
  10.         self.a,self.b=self.b,self.a+self.b
  11.         if self.a >self.n:
  12.             raise StopIteration
  13.         
  14.         return self.a
  15.         
  16. dic={"1":"一","2":"二","3":"三","4":"四","5":"五","6":"六","7":"七","8":"八","9":"九","0":"零"}
  17. fib=Fib(10000)
  18. for a in fib:
  19.     list1=[]
  20.     list2=[]


  21.     for i in str(a):
  22.         list1.append(i)
  23.     for i in list1:
  24.         list2.append(dic.get(i))

  25.     list3=list2[:]
  26.     list3.reverse()
  27.     if len(list3)>=2:
  28.         list3.insert(1,"十")
  29.         if len(list3)>=4:
  30.             list3.insert(3,"百")
  31.             if len(list3)>=6:
  32.                 list3.insert(5,"千")
  33.                 if len(list3)>=8:
  34.                     list3.insert(7,"万")
  35.     list3.reverse()
  36.    
  37.     if list3[len(list3)-1] =="零":
  38.         del list3[len(list3)-1]
  39.     if "零" in list3:
  40.         a=list3.index("零")
  41.         del list3[a+1]
  42.     while list3.count("零")>1:
  43.         if list3.count("零")>=2:
  44.             del list3[list3.index("零",list3.index("零")+1,len(list3))+1]
  45.             del list3[list3.index("零",list3.index("零")+1,len(list3))]
  46.     s=''
  47.     for i in list3:
  48.         s=s+i
  49.     print(s)
  50.         
  51.         

复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 14:41:42 | 显示全部楼层
class Fib:
    def __init__(self,a=0,b=0,c=1,cmax=10000):
        self.__a,self.__b,self.__c = a,b,c
        self.__cmax = cmax
    def __iter__(self):
        return self
    def __next__(self):
        if self.__a<1:
            self.__a=self.__b
            self.__b=self.__c
            return self.__c
        else:
            self.__c=self.__a+self.__b
            if self.__c<=self.__cmax:
                self.__a=self.__b
                self.__b=self.__c
                return self.__c
            else:
                    raise StopIteration

def convert(n):
    num=[1,2,3,4,5,6,7,8,9,0]
    cn=['一','二','三','四','五','六','七','八','九','']
    dw=['','十','百','千','万']
    n=str(int(n))
    c=len(n)-1
    ln=''
    c1=0;
    for i in n:
        nb = int(i) - 1
        if i=='0' and c1==0:
            c1=1
            pass
        else:
            if c1==1:
               c1=0
            ln=ln+ cn[nb]+dw[c]
        c=c-1
    return(ln)
if __name__=='__main__':
    fib=Fib()
    for i in Fib():
        print(convert(i))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 20:35:40 | 显示全部楼层
  1. def ch(x):
  2.     st='零一二三四五六七八九'
  3.     unit=['','十','百','千']
  4.     s=str(x)
  5.     l=len(s)
  6.     tar=''
  7.     try:
  8.         for i in range(l):
  9.             c=unit[i]
  10.             if s[l-1-i]=='0':
  11.                 c=''
  12.             tar=st[int(s[l-1-i])]+c+tar
  13.         tar=tar.strip('零')
  14.         tar=tar.replace('零零','零')
  15.         if 9<x<20:
  16.             tar=tar[1:]
  17.     except:
  18.         tar='醒醒,超1万了,你还没编'
  19.     return tar
  20. class Fib:
  21.     def __init__(self):
  22.         self.a=0
  23.         self.b=1
  24.     def __iter__(self):
  25.         return self
  26.     def __next__(self):
  27.         self.a,self.b=self.b,self.a+self.b
  28.         return ch(self.a)
复制代码

想了一下单位有兆亿万的情况下还要保证格式挺麻烦的= =

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 00:36:29 | 显示全部楼层
class Fib():
    def cn(self,n):
        str1 = ''
        num = ['零','一','二','三','四','五','六','七','八','九']
        k=['零','十','百','千','万','十万','百万','千万','亿']
        for i in range(len(str(n))):
            if int(str(n)[i]) != 0:
                str1 = str1 + num[int(str(n)[i])] + k[len(str(n)) - i -1]
            elif int(str(n)[i - 1]) != 0:
                str1 = str1 + num[int(str(n)[i])]
        print(str1)

    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = self.a + self.b
    def __next__(self):
        self.a = self.b
        self.b = self.c
        self.c = self.a + self.b
        return self.cn(self.a)
    def __iter__(self):
        return self.cn(self)

改成中文那段代码写的不好,技术有限

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 10:34:14 | 显示全部楼层
本帖最后由 776667 于 2018-3-22 10:44 编辑
  1. class fib:
  2.     def __init__(self):
  3.         self.x = -1
  4.         self.y = 1

  5.     def __iter__(self):
  6.         return self

  7.     def __next__(self):
  8.         if self.x == -1 or self.x == 0:
  9.             result = 1
  10.             self.x += 1
  11.         else:
  12.             result = self.x + self.y
  13.             self.x,self.y = self.y,result
  14.         if result >= 1000000:
  15.             raise StopIteration()
  16.         rank = ['零','十','百','千','万','十']
  17.         num = ['零','一','二','三','四','五','六','七','八','九']
  18.         result = list(str(result))[::-1]
  19.         result_output = []
  20.         for i in range(len(result)):
  21.             if result[i] == '0' and i == 0:
  22.                 continue
  23.             if result[i] == '0':
  24.                 result_output.append('零')
  25.                 continue
  26.             if result[i] == result[i-1] == 0:
  27.                 continue
  28.             if i == 0:
  29.                 result_output.append(num[int(result[i])])
  30.             else:
  31.                 result_output.append('%s%s'%(num[int(result[i])],rank[i]))
  32.         return ''.join(result_output[::-1])
复制代码
  1. for i in fib():
  2.         print(i)

  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. 八十三万二千零四十
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 11:56:42 | 显示全部楼层
本帖最后由 inverseli 于 2018-3-22 11:59 编辑
  1. import sys
  2. intab = "1234567890"
  3. outtab = "一二三四五六七八九零"
  4. #产生数列的类
  5. class Fib:
  6.     def __init__(self):
  7.         self.a = 0
  8.         self.b = 1
  9.     def __iter__(self):
  10.         return self
  11.     def __next__(self):
  12.             re = self.b
  13.             self.b += self.a
  14.             self.a = re
  15.             return re
  16. #10000以内的数字转换函数
  17. def zhuanhuan(n):
  18.     str1 = str(n)
  19.     #字符映射转换表
  20.     trantab = str.maketrans(intab,outtab)
  21.     #字符映射
  22.     str2 = str1.translate(trantab)
  23.     if len(str2) >3:
  24.         if str2[1] =="零":
  25.             print(str2[0] + "千"+str2[1] +str2[2]+"十"+str2[3])
  26.         if str2[2] =="零":
  27.             print(str2[0] + "千"+str2[1]+"百" +str2[2]+str2[3])
  28.         if str2[3] =="零":
  29.             print(str2[0] + "千"+str2[1]+"百" +str2[2]+"十")
  30.         if "零"not in str2:
  31.             print(str2[0] + "千"+str2[1]+"百" +str2[2]+"十"+str2[3])
  32.     elif len(str2) > 2:
  33.         if str2[1] =="零":
  34.             print(str2[0]+"百" +str2[1]+str2[2])
  35.         if str2[2] =="零":
  36.             print(str2[0]+"百" +str2[1]+"十")
  37.         if "零"not in str2:
  38.             print(str2[0]+"百" +str2[1]+"十"+str2[2])
  39.     elif len(str2)>1:
  40.         if str2[0] == "一" and str2[1] !="零":
  41.             print("十"+str2[1])
  42.         elif str2[0] != "一" and str2[1] =="零":
  43.             print("十")
  44.         else:
  45.             print(str2[0]+"十"+str2[1])
  46.     else:
  47.         print(str2[0])
  48. #测试
  49. fib = Fib()
  50. for i in fib:
  51.     if i<10000:
  52.         zhuanhuan(i)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 12:40:19 | 显示全部楼层
class Fib:
    def __init__(self,n=10):
        self.a=1
        self.b=1
        self.n=n
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        if self.a>self.n:
            raise StopIteration
        bai=self.a//100
        ge=self.a%10
        shi=(self.a-bai*100-ge)//10
        hanzi='零一二三四五六七八九'
        if bai==0 and ge!=0 and shi==0:
            return (hanzi[ge])
        elif bai==0 and shi==1 and ge!=0:
            return ('十'+hanzi[ge])
        elif bai==0 and shi>1 and ge!=0:
            return (hanzi[shi]+'十'+hanzi[ge])
        elif bai==0 and ge==0 and shi!=0:
            return (hanzi[shi]+'十')
        elif bai==0 and shi==0:
            return (hanzi[ge])
        elif bai!=0 and shi!=0 and ge!=0:
            return (hanzi[bai]+'百'+hanzi[shi]+'十'+hanzi[ge])
        elif bai!=0 and shi!=0 and ge==0:
            return (hanzi[bai]+'百'+hanzi[shi]+'十')
        elif bai!=0 and shi==0 and ge!=0:
            return (hanzi[bai]+'百'+hanzi[shi]+hanzi[ge])
        else:
            return (hanzi[bai]+'百')

   
我只写到了一千以内,因为用的是穷举法,对于汉字读法这块我,我再想想有没有更好的方法。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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