统计1到n出现的1的个数(不能用字符串)
2015-07-19 09:50
579 查看
转http://blog.chinaunix.net/uid-8615291-id-2456793.html
题目:
实现函数int func(unsigned n),其中n为正整数,返回从1到n(包含1和n)之间出现的1的个数,如func(13)=6,func(9)=1。(注意:不能将整数转化为字符串,剑指offer中的方法不能用)
分析:
对于数n,可以把它分成三段,高位段most,当前位cur,低位段least,每一段分别为一个整数。对于一个有digit位的数,假设当前位是左数第i位,则设一个临时变量tmp为10的digit-i次方,即比least多一位的最小整数。如数123456,为6位数,digit=6,设当前为左起第3位,则i=3,most=12,cur=3,least=456,tmp=1000。
如果当前位大于1,则从1到n间出现在当前位出现的1的个数是most*tmp+tmp;如果等于1,则是most*tmp+least+1;如果小于,则为most*tmp。
实现:
题目:
实现函数int func(unsigned n),其中n为正整数,返回从1到n(包含1和n)之间出现的1的个数,如func(13)=6,func(9)=1。(注意:不能将整数转化为字符串,剑指offer中的方法不能用)
分析:
对于数n,可以把它分成三段,高位段most,当前位cur,低位段least,每一段分别为一个整数。对于一个有digit位的数,假设当前位是左数第i位,则设一个临时变量tmp为10的digit-i次方,即比least多一位的最小整数。如数123456,为6位数,digit=6,设当前为左起第3位,则i=3,most=12,cur=3,least=456,tmp=1000。
如果当前位大于1,则从1到n间出现在当前位出现的1的个数是most*tmp+tmp;如果等于1,则是most*tmp+least+1;如果小于,则为most*tmp。
实现:
int func(unsigned n) { int count = 0; int digit = (int)log10(n) + 1; int most, cur, least, tmp; int i; for (i=0; i<digit; ++i) { tmp = (int)pow(10, digit-i-1); most = n / tmp / 10; cur = (n / tmp) % 10; least = n % tmp; count += most * tmp; if (cur > 1) { count += tmp; } else if (cur == 1) { count += least + 1; } } return count; } |
相关文章推荐
- pip安装包
- zoj 1188 DNA Sorting(STL)
- leetcode 81 :Search in Rotated Sorted Array II
- Android Binder- 一次完整的通信过程
- Shell编程中括号判断中赋值语句和判断语句
- PowerDesigner使用教程
- ajax笔记
- Gitlab 上Iisues 使用以及代码管理
- VS编程常见的编译和链接错误
- UIView相对坐标转换
- Scala:条件表达式的好处
- 0033 C与OC差异
- string和stringBuffer的区别
- [FlashDevelop] 002.FlashDevelop + LayaFlash播放SWF并转成HTML5
- phprpc的使用示例以及报错Fatal error: Cannot redeclare gzdecode() in D:\wamp\www\immoc\phprpc\compat.php 处理
- poj解题报告——1835
- 一位ACMer过来人的心得
- ${pageContext.request.contextPath} JSP取得绝对路径
- 北风网66jquery
- Android 判断网络连接情况