数学的威力!

类别:软件工程 点击:0 评论:0 推荐:

        上个星期,看到电脑报的编程题,用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