首页 > 其他 > 详细

《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)

时间:2015-09-12 10:52:47      阅读:194      评论:0      收藏:0      [点我收藏+]

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】


题目链接:http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

思路

编程之美上给出的规律:
1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字X当前位数的权重10^(i-1)。
2. 如果第i位上的数字为1,则第i位上可能出现1的次数不仅受更高位影响,还受低位影响(若没有低位,视低位为0),等于更高位数字X当前位数的权重10^(i-1)+(低位数字+1)。
3. 如果第i位上的数字大于1,则第i位上可能出现1的次数仅由更高位决定(若没有高位,视高位为0),等于(更高位数字+1)X当前位数的权重10^(i-1)。


class Solution
{
	public:

		int NumberOf1Between1AndN_Solution(int n)
		{
			int count =0;
			int i =1;
			int current =0,after =0,before =0;
			while((n / i) !=0)
			{
				current = (n / i) %10;
				before = n / (i *10);
				after = n - (n / i) * i;
				if (current >1)
					count = count + (before +1) * i;
				else if (current ==0)
					count = count + before * i;
				else if(current ==1)
					count = count + before * i + after +1;
				i = i *10;
			}
			return count;
		}

};


版权声明:本文为博主原创文章,如果转载,请注明出处

《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)

原文:http://blog.csdn.net/libin1105/article/details/48391399

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!