Google经典面试题:求从1到n的n个整数中,字符“1”出现的个数

题目:

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12, 1一共出现了5次。


题解:

算法:

以整数“n = 13254”为例,

个位出现1的次数=n/10^1×10^0 + (若个位 = 0, 则 0;个位 > 1, 则1; 若个位 = 1,低0位+1); =》 13254/10 + 1 = 1326

十位位出现1的次数=n/10^2*10^1+(十位=0,0;十位>1,10,;十位=1,低一位+1);=> 13254/100*10 + 10 = 1330

百位出现1的次数=n/10^3*10^2+(百位=0,0;百位>1,100;百位=1,低两位+1);=> 13254/1000*100 + 100 = 1400

以此类推,

千位出现1的次数 =》13254/10000×1000 + 1000 = 2000

万位出现1的次数=》13254/100000×10000 + 3254+1 = 3255

1出现的次数共计 = 9311次。

#include <iostream>

using namespace std;

class Solution {
public:
	int NumOfOnes( int number )
	{
		int numOfOnes = 0;

		if( number <= 0 )
			return numOfOnes;

		int temp = number;
		int i = 1;
		while(temp) //由个位开始处理到最高位
		{
			int mask = 1;//处理个位时mask = 1, 十位时mask = 10,以此类推
			for(int j = 1; j <= i-1; j++)
				mask *= 10;

			//计算当前位的值
			int curDigit = temp % 10;
			//计算低于当前位的各位所表示的数值
			int lastDigits = number % (temp * mask);
			
			//修改当前值,作为循环结束条件
			temp = temp / 10;
			 
			numOfOnes += temp * mask;

			if( curDigit == 1 )
				numOfOnes = numOfOnes + 1 + lastDigits;
			else if( curDigit > 1 )
				numOfOnes = numOfOnes + mask;

			i++;
		}

		return numOfOnes;
	}
};

int main(int argc, const char* argv[])
{
	Solution s;
	cout << s.NumOfOnes(13254) << endl; 
	
	return 0;
}


你可能感兴趣的:(Algorithm,Google,1的次数)