中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 未整理篇
数学的威力!
作者:jamesfangjing 时间:2003-02-17 11:10 出处:互联网 责编:chinaitpower
              摘要:数学的威力!

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


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有