题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
思路:有规律:
遍历每一位,
- 当前位为0,则在此位上1出现的个数为高位组成的数乘以当前位的位数(十位则乘以10,百位乘以100)。
- 当前位为1,则个数为 高位数*位数 + (低位数+1)。
- 当前位大于1,则个数为(高位数+1)*位数。
#include <iostream>
#include <vector>
using namespace std;
int NumberOf1(int n) {
if (n <= 0)
return 0;
int wei = 1;
int count = 0;
while (n / wei != 0) {
int high = n / (wei * 10);
int low = n - (n / wei) * wei;
int cur = (n / wei) % 10;
if (cur == 0) {
count += high * wei;
} else if (cur == 1) {
count += high * wei + low + 1;
} else {
count += (high + 1) * wei;
}
wei *= 10;
}
return count;
}
int main() {
int n;
cin >> n;
int count = NumberOf1(n);
cout << count << endl;
return 0;
}