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