星球实战的一道题(数字转英文)

菜鸟玩python的题目:

如果数字1到5用英语写出:one,two,three,four,five,则总共使用3 + 3 + 5 + 4 + 4 = 19个字母。如果所有1到1001(包含一千零一)的数字都用英语写出来,会用多少个字母?

我的解题思路如下:


image.png

在解题的过程中,先利用自己所学进行尝试,先假设自己能转换成为英语单词
比如说136转换成为one hundred and thirty-six,words="one hundred and thirty-six"
先算出words 的长度26
这里面包含空格及连接符"-"
再移去空格,查到正则表达式re.sub(表达式,替换成"",要处理的字符串)

  pttn=r'\s'
  result=re.sub(pttn,'',words)

字符串变为onehundredandthirty-six
再去移去"-"
字符串变为onehundredandthirtysix
并计算单词的长度为22

至此完成了第三步,将这个过程加入到循环中,就可以算出总的字母的个数21141, 在这个过程中,会出现很多错误, 每次调试都会让自己了解的自己理解的不足之处,然后更新迭代

解题的代码下:

from  num2words import num2words
 import re
 words_number=0
for num in range(1,1002):
   pttn=r'[\s\-]'
   word=num2words(num)
   words=re.sub(pttn,'',word)
   words_number=words_number+len(words)
print(words_number)

现在再回到第1步,将数字转英文,开始以为用excel简单下拉就行,后来证实做不到,然后上网查,number to words python,就找到相关的代码
链接如下:
https://codereview.stackexchange.com/questions/39183/python-converter-number-to-english-project-euler-17

借用他人编好的程序为自己所用,同时去研究学习他人是怎样写代码的,这个过程,可以让自己更一步提升,先多读他人的代码,再自己编写代码解决问题。

数字转英文分两部份:
1.单词表

   NUMBER_WORDS = {
1 : "one",
2 : "two",
3 : "three",
4 : "four",
5 : "five",
6 : "six",
7 : "seven",
8 : "eight",
9 : "nine",
10 : "ten",
11 : "eleven",
12 : "twelve",
13 : "thirteen",
14 : "fourteen",
15 : "fifteen",
16 : "sixteen",
17 : "seventeen",
18 : "eighteen",
19 : "nineteen",
20 : "twenty",
30 : "thirty",
40 : "forty",
50 : "fifty",
60 : "sixty",
70 : "seventy",
80 : "eighty",
90 : "ninety"   }

2.函数部份:

   def convert_number_to_words(num):
#Works up to 99,999
num = str(num)
analyze = 0
postfix = remainder = None
string = ""
if len(num) > 4:
    analyze = int(num[0:2])
    remainder = num[2:]
    postfix = " thousand "
elif len(num) > 3:
    analyze = int(num[0:1])
    remainder = num[1:]
    postfix = " thousand "
elif len(num) > 2:
    analyze = int(num[0:1])
    remainder = num[1:]
    postfix = " hundred "
    if int(remainder) > 0:
        postfix += "and "
elif int(num) in NUMBER_WORDS:
    analyze = int(num)
else:
    analyze = int(num[0:1] + "0")
    remainder = num[1:]
    postfix = "-"
string = NUMBER_WORDS[analyze]
if postfix is not None:
    string += postfix
if remainder is not None and int(remainder) > 0:
    return string + convert_number_to_words(remainder)
else:
    return string

3.调用函数

   “用于测试此函数是否可行”
      num=10
while int(num) >0:
    num=input('input your number,if quit please input q:')
    if num =='q':
        break
    else:
    result=convert_number_to_words(num)
    print(result)

上面链接中的代码,也有错误,比如说当数字为1001时,它就会报错
后来,我去分析其代码,画逻辑图,才知道为什么要这么做?以及在哪里可以修改代码,逻辑图如下:


image.png

所以重新修改后的完整代码为:

 def convert_number_to_words(num):
#Works up to 99,999
num = str(num)
analyze = 0
postfix = remainder = None
string = ""
if len(num) > 4:
    analyze = int(num[0:2])
    remainder = num[2:]
    postfix = " thousand "
elif len(num) > 3:
    analyze = int(num[0:1])
    remainder = num[1:]
    postfix = " thousand "
    if int(remainder[0])== 0 and int(remainder[1:]) > 0:
        remainder= num[2:]
        postfix +=" and "
        if int(remainder[1]) == 0:
            remainder = num[3]
    else:
        remainder=num[3]
elif len(num) > 2:
    analyze = int(num[0:1])
    remainder = num[1:]
    postfix = " hundred "
    if int(remainder) > 0:
        postfix += "and "
elif int(num) in NUMBER_WORDS:
    analyze = int(num)
else:
    analyze = int(num[0:1] + "0")
    remainder = num[1:]
    postfix = "-"
string = NUMBER_WORDS[analyze]
if postfix is not None:
    string += postfix
if remainder is not None and int(remainder) > 0:
    return string + convert_number_to_words(remainder)
else:
    return string

 word_number=0
for number in range(1,1002):
   result=convert_number_to_words(number)
    move_blank=re.sub(r'\s|-','',result)
    word_number=word_number+len(move_blank)
print(word_number)

计算的结果为21141

体会:

1、学习编程可以锻炼我们的思维能力,将思考的过程可视化
2、编程可以获得即时反馈,这一点对于学习新的技能很重要,如果没有反馈,要想持续地投入时间学习,有点难,而编程可以,边尝试,边获得结果
3、对问题的拆解能力,将一个目标拆解成自己可以解决的小问题,再组合,在编程过程中得到完美的体现
4、编程是一种集体协作的活动,你可以利用他人的作品,用在自己的程序内从而更快捷地解决问题,而你的作品也可以成为他人解决问题的桥梁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269