【刷题】从1到n整数中1出现的次数
来源:互联网 发布:全志科技 知乎 编辑:程序博客网 时间:2024/06/06 10:46
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12共5个。
思路:1、从1到n逐个数字计算1出现的次数。直观但不高效
2、考虑将n的十进制的每一位单独拿出讨论,每一位的值记为weight。
1) 个位
从1到n,每增加1,weight就会加1,当weight加到9时,再加1又会回到0重新开始。那么weight从0-9的这种周期会出现多少次呢?这取决于n的高位是多少,看图:
以534为例,在从1增长到n的过程中,534的个位从0-9变化了53次,记为round。每一轮变化中,1在个位出现一次,所以一共出现了53次。
再来看weight的值。weight为4,大于0,说明第54轮变化是从0-4,1又出现了1次。我们记1出现的次数为count,所以:
如果此时weight为0(n=530),说明第54轮到0就停止了,那么:
2) 十位
对于10位来说,其0-9周期的出现次数与个位的统计方式是相同的,见图:
不同点在于:从1到n,每增加10,十位的weight才会增加1,所以,一轮0-9周期内,1会出现10次。即rount*10。
再来看weight的值。当此时weight为3,大于1,说明第6轮出现了10次1,则:
如果此时weight的值等于0(n=504),说明第6轮到0就停止了,所以:
如果此时weight的值等于1(n=514),那么第6轮中1出现了多少次呢?很明显,这与个位数的值有关,个位数为k,第6轮中1就出现了k+1次(0-k)。我们记个位数为former,则:
3) 更高位
更高位的计算方式其实与十位是一致的,不再阐述。
4) 总结
将n的各个位分为两类:个位与其它位。
对个位来说:
- 若个位大于0,1出现的次数为
round*1+1
- 若个位等于0,1出现的次数为
round*1
对其它位来说,记每一位的权值为base,位值为weight,该位之前的数是former,举例如图:
则:
- 若weight为0,则1出现次数为
round*base
- 若weight为1,则1出现次数为
round*base+former+1
- 若weight大于1,则1出现次数为
rount*base+base
比如:
- 534 = (个位1出现次数)+(十位1出现次数)+(百位1出现次数)=(53*1+1)+(5*10+10)+(0*100+100)= 214
- 530 = (53*1)+(5*10+10)+(0*100+100) = 213
- 504 = (50*1+1)+(5*10)+(0*100+100) = 201
- 514 = (51*1+1)+(5*10+4+1)+(0*100+100) = 207
- 10 = (1*1)+(0*10+0+1) = 2
代码:
int countNumCore(int n){int result = 0;while (n){if (n%10==1)result++;n = n / 10;}return result;}int countNum(unsigned int n){int count = 0;for (unsigned int i = 1; i <= n; i++)count=count+countNumCore(i);return count;}
int count(int n){ if(n<1) return 0; int count = 0; int base = 1; int round = n; while(round>0){ int weight = round%10; round/=10; count += round*base; if(weight==1) count+=(n%base)+1; else if(weight>1) count+=base; base*=10; } return count;}
阅读全文
0 0
- 整数中1出现的次数(从1到n整数中1出现的次数)
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到 n整数中1出现的次数
- 从1到n整数中1出现的次数
- Java_基础—TreeMap集合键是Student值是String的案例
- 时间调度的架构
- 掌握flash的as3图形学Stage3d的屏幕坐标和纹理UV采样坐标
- SPOJ Fast Maximum Matching(二分图最大匹配Hopcroft-Carp)
- 终端提交代码到码云
- 【刷题】从1到n整数中1出现的次数
- React学习(七)获取真实的DOM节点
- (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escap
- 选择器总结
- Linux设备驱动模型与kobject的关系
- RNN学习笔记以及LSTM详解
- XL6009 DC-DC升压模块
- 汉诺塔[递归]
- mybatis 缓存(二) 二级缓存