面试题32 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
1 class Solution { 2 public: 3 int NumOf1(const char* strN){ 4 if (!strN || *strN < '0' || *strN > '9' || *strN == '\0'){ 5 return 0; 6 } 7 int first = *strN - '0'; 8 unsigned int l = static_cast<unsigned int>(strlen(strN)); 9 if (l == 1 && first == 0) 10 return 0; 11 if (l == 1 && first > 0) 12 return 1; 13 int numberFirst = 0; 14 if (first > 1) 15 numberFirst = pow(10, l - 1); 16 else if (first == 1) 17 numberFirst = atoi(strN + 1) + 1; 18 int numberOther = first * (l - 1) * pow(10, l - 2); 19 int numberRecur = NumOf1(strN + 1); 20 return numberFirst + numberOther + numberRecur; 21 } 22 23 int NumberOf1Between1AndN_Solution(int n) 24 { 25 if (n < 0){ 26 return 0; 27 } 28 char strN[50]; 29 sprintf(strN, "%d", n); 30 return NumOf1(strN); 31 } 32 };