免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4403 | 回复: 5
打印 上一主题 下一主题

请教一个python函数的写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-26 15:40 |只看该作者 |倒序浏览
想写一个python函数,实现:
有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6 ; f(11)=4

请教一下该怎么写呢?谢谢

论坛徽章:
0
2 [报告]
发表于 2010-04-26 16:18 |只看该作者
  1. #!/usr/bin/python

  2. def f(i):
  3.         cnt = 0;
  4.         for x in range(0, i+1):
  5.                 cnt += str(x).count('1')
  6.         return cnt;

  7. test = [13, 11, 101]
  8. for x in test:
  9.         print "f(%d) = %d" %(x, f(x))
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-04-26 16:37 |只看该作者
回复 2# chunchengfh
不用range()
  1. def f(i):
  2.     cnt = 0
  3.     while i>0:
  4.         cnt += str(i).count('1')
  5.         i-=1
  6.     return cnt

  7. print f(13)
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-04-26 20:24 |只看该作者
多谢,写的都比较简洁,不过如果数字串比较长的话,效率不是很高

论坛徽章:
0
5 [报告]
发表于 2010-04-27 09:40 |只看该作者
一个个数  N很大的时候肯定慢,得找个好的算法。

论坛徽章:
0
6 [报告]
发表于 2010-04-29 21:12 |只看该作者
《编程之美》里面专门讨论过这个问题,是有专门的算法的,通过分析n就可以直接得到f(n)的结果,翻译成python:
  1. def f(n):
  2.         iCount=0
  3.         iFactor=1
  4.         iLowerNum=0
  5.         iCurrNum=0
  6.         iHigherNum=0
  7.         while(n/iFactor!=0):
  8.                 iLowerNum=n-(n/iFactor)*iFactor
  9.                 iCurrNum=(n/iFactor)%10
  10.                 iHigherNum=n/(iFactor*10)

  11.                 if iCurrNum==0:
  12.                         iCount+=iHigherNum*iFactor
  13.                 elif iCurrNum==1:
  14.                         iCount+=iHigherNum*iFactor+iLowerNum+1
  15.                 else:
  16.                         iCount+=(iHigherNum+1) * iFactor

  17.                 iFactor*=10

  18.         return iCount

  19. print f(11)
  20. print f(13)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP