上个星期,看到电脑报的编程题,用python写写,简而言之,就是把阿拉伯数字用中文读出来,计算总时间!不算很难吧,却一度停滞不前!因为程序要求读n个数,每个都读出来,计算量太大了,而且有些小问题处理不好,故而放了一段时间!
到了周末,又想起来,看着自己写的烂代码,愤而删之,从来来过!先不写代码,好好想想,用归纳法,总结出一个公式,所有的数,都可以用这个来读,直接可以计算读出的秒数!再来重写代码,不仅写的快,代码运行效率何止翻倍!
数学的魅力就在于此了,平时看起来那些毫无用处的东西,过于理论的东西,一旦用起来,其效果不可估量!编程的技巧,在怎么样,提高程序的效率有限,一旦算法上,数学上有一个突破,完全可能把复杂度从o(n^2)变到o(n),其结果不言而喻!程序的效率成倍提高!厉害!
代码如下:应该还可以改进,高手指点!
# -*- coding: cp936 -*- #这是为了显示中文注释所用的代码!
def readNumber(num): #获得每个数每位的数
p=0 #每个数的位数
for i in range(1,15):
if num/(10**i)<=0:
p=i
break
if p==1: #1位数统一读1秒
s=1
return s
if p>12: #超过万亿的数,太大,不读!
return 0
pos=[0]*p
for i in range(0,p): #获得每个位置的数
pos[p-i-1]=num%10
num=num/10
j=(p-1)/4 #分节来处理,每节4个数
k=p-j*4 #最前面一节所余的位数
s=0
if j==0:
s=s+readJie(pos[0:k])
elif j==1:
s=s+readJie(pos[-4:])
s=s+readJie(pos[0:k])
elif j==2:
s=s+readJie(pos[-4:])
s=s+readJie(pos[-8:-4])
s=s+readJie(pos[0:k])
s=s+j #每节的结果,要加上‘万’,‘亿’这两个字,所以相当于加上节数!
return s
def readJie(pos): #每节要读的时间,一般是位数×2-1,逢零减一,逢连续的零,在减一
s=len(pos)*2-1
isconnect=0 #判断是否有0连在一起的标志
for i in range(0,len(pos)):
if pos[i]==0:
if isconnect==0:
s=s-1
isconnect=1
else:
s=s-2
else:
isconnect=0
return s
isright=0
while isright==0:
n=input("Input a number n:")
m=input("Input a number m(n<m):")
if n<m:
isright=1
s=0
for i in range(n,m+1):
r=readNumber(i)
if r==0:
print "Too Big!"
break
s=s+r
print s
本文地址:http://com.8s8s.com/it/it33794.htm