【面试题032】从1到n整数中1出现的次数
题目:
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1出现了5次。
思路一:
对每一个数字做判断,把1出现的数字累加。
可以通过对10取余,判断这个数字个位上的数字是不是等于1,然后这把这个数字除以10,相当于是10进制下面的向右边移动了一位。
如果输入数字为n,n有logn位,那么我们要判断每一位是不是1,那么它的计算时间复杂度是O(n*logn)。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream>
using namespace std; int NumberOf1( unsigned int n) { int number = 0; while (n) { if (n % 10 == 1) { number ++; } n = n / 10; } return number; } int NumberOf1Between1AndN( unsigned int n) { int number = 0; for ( unsigned int i = 1; i <= n; ++i) { number += NumberOf1(i); } return number; } int main() { unsigned int num = 12; cout << NumberOf1Between1AndN(num) << endl; return 0; } |
思路二:
对每一个数字做判断,把1出现的数字累加。