题目:
输入一个整数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
#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;
}