1到n的整数中,1出现的次数
参考链接:https://discuss.leetcode.com/topic/18054/4-lines-o-log-n-c-java-python
1到n的整数中,1出现的次数,如11中,1出现了两次,并不是求包含1的数的个数
找规律:
假设n为六位数 abcdef.
求个位(f所在位)为1的数的个数C1:
将n分为两部分:
P = n / 1 = abcdef
Q = n % 1 = 0
对P,如果f > 1,则f的前缀从0~abcde,共(abcde+1)个
如果f == 1,则f的前缀从0~abcde-1, ,共(abcde)个
当前缀为abcde时,f为1,即以abcde为前缀的数,对于前缀,abcde,对应的数为:abcdef,C1共(abcde * 1 ) + (Q+1) 个,共(abcde+1)个
如果f == 0,则f的前缀从0~abcde-1,共(abcde)个
求十位(e所在位)为1的数的个数C10:
将n分为两部分:
P = n / 10 = abcde
Q = n % 10 = f
对P,如果e > 1,则e的前缀从0~abcd,对于每一个前缀,a'b'c'd',它对应着十个数:a'b'c'd'1f'(f'从0到9),C10共( abcd +1 ) * 10个
如果e == 1,则e的前缀从0~abcd-1,对于每一个前缀,a'b'c'd',它对应着十个数:a'b'c'd'1f'(f'从0到9)
当前缀为abcd时,e为1,即以abcde为前缀的数,对于前缀,abcde,对应的数为:abcdef'(f'从0到f),C10共(abcd * 10 ) + (Q+1) 个
如果e == 0,则e的前缀从0~abcd-1,对于每一个前缀,a'b'c'd',它对应着十个数:a'b'c'd'1f'(f'从0到9)
当前缀为abcd时,e为0,没有十位为1的数,C10共(abcd * 10 )个
求百位(d所在位)为1的数的个数C100:
将n分为两部分:
P = n / 100 = abcd
Q = n % 100 = ef
对P,如果d > 1,则d的前缀从0~abc,对于每一个前缀,a'b'c',它对应着一百个数:a'b'c'1e'f'(e'f'从00到99),C100共(abc+1) * 100个
如果d == 1,则d的前缀从0~abc-1,对于每一个前缀,a'b'c',它对应着一百个数:a'b'c'1e'f'(e'f'从00到99)
当前缀为abc时,d为1,即以abcd为前缀的数,对于前缀,abcd,对应的数为:abcde'f'(e'f'从00到ef),C10共(abc * 100 ) + (Q+1) 个
如果d == 0,则d的前缀从0~abc-1,对于每一个前缀,a'b'c',它对应着一百个数:a'b'c'1e'f'(e'f'从00到99)
当前缀为abc时,d为0,没有百位为1的数,C100共(abc * 100 )个
。。。。。。
设P = abcd
当d==0时,( P + 8 )/ 10 = abc
当d==1时,( P + 8 )/ 10 = abc
当d>1时,( P + 8 )/ 10 = abc+1
代码如下:
void countOne( int n ) {int cnt = 0;for( int m = 1; m <= n; m *= 10 ){int a = n / m;int b = n % m;cnt += ( ( a + 8 ) / 10 ) * m;if( a % 10 == 1 ){cnt += ( b+1 );}}return cnt; }
3出现的次数也采用同样的办法:
int countT( int n ) {int cnt = 0;for( int m = 1; m <= n; m *= 10 ){int a = n / m;int b = n % m;cnt += ( ( a + 6 ) / 10 ) * m;if( a %10 == 3 ){cnt += ( b+1 );}}return cnt; }
转载于:https://www.cnblogs.com/wangzhiyi/p/6862186.html
1到n的整数中,1出现的次数相关推荐
- shell最大出现和连续出现次数_从 1 到 n 整数中 1 出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 【刷算法】整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 从1到n整数中1出现的次数
从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次, ...
- 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...
- 《剑指offer》第四十三题(从1到n整数中1出现的次数)
// 面试题43:从1到n整数中1出现的次数 // 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如 // 输入12,从1到12这些整数中包含1 的数字有1,10,11和12 ...
- 《剑指offer》-整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
最新文章
- 3dsMax插件V-Ray渲染与合成学习课程 3ds Max: Rendering for Compositing in V-Ray Next
- shader 2: vertex, fragment, surf的区别
- 四位共阳极数码管显示函数_Verilog笔记
- NOJ37 回文字符串---整理一下都是各种回文类型啊,
- 杭州「增长黑客」集结令!曲卉老师想约你来网易聊一聊
- [转]JQuery.Ajax之错误调试帮助信息
- 前端学习(1855)vue之电商管理系统电商系统之安装mysql出现VCRUNTIME140_1.dll
- python图纸教程_python入门教程 python入门神图一张
- imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
- vim命令失效了怎么办
- [渝粤教育] 西南科技大学 成本会计 在线考试复习资料(1)
- MinGW安装及介绍
- Python Pymysql实现数据存储
- the sdk seems invalid pycharm
- 网页旅游景点页面建设
- 父进程退出后,子进程自动消亡
- 支持向量机1-线性可分支持向量机
- Facade模式新解
- Win10同时安装两个版本的JDK并随时切换,JDK8和JDK11手把手教学
- 如何在500个甚至上千微信群运营推广和赚钱?