1049 Counting Ones (30 分)
The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.
Input Specification:
Each input file contains one test case which gives the positive N (≤230).
Output Specification:
For each test case, print the number of 1's in one line.
Sample Input:
12
Sample Output:
5
一,注意点
1,本题的思路主要引擎便是分类讨论了,分为当前数位是0,1和其他数进行讨论。
2,求当前位,当前位左边的数字,当前位右边的数字我的方法很复杂,本题标准答案提供的方法极其简便,需要记住。
这里的a从1开始,
当前位:now=n/a%10
左边数字:left=n/(a*10)
右边数字:right=n%a
二,我的代码
#include<cstdio>
using namespace std;
typedef long long LL;
LL N = 0;
int len = 0;
int count_len(LL num) {
int part_len = 0;
do {
num /= 10;
part_len++;
} while (num != 0);
return part_len;
}
int now_bit(int now_len) {
int rate_1 = 1;
int rate_2 = 1;
int ans = 0;
for (int i = 1; i <= now_len; i++) {
rate_1 *= 10;
}
rate_2 = rate_1 / 10;
ans = N % rate_1 / rate_2;
return ans;
}
LL switch_to_ten_radix(int now_len) {
LL ans = 1;
for (int i = 1; i <= now_len; i++) {
ans *= 10;
}
return ans;
}
LL left_num(int now_len) {
int part_len = 1;
int ans_rate = 1;
for (int i = part_len; i <= now_len; i++) {
ans_rate *= 10;
}
return N / ans_rate;
}
LL right_num(int now_len) {
int part_len = 1;
int ans_rate = 1;
for (int i = part_len; i < now_len; i++) {
ans_rate *= 10;
}
return N % ans_rate;
}
int main() {
int len = 0, now_len = 1;
LL num_of_left = 0, num_of_right = 0;
int left_len = 0, right_len = 0;
int pos_num = 0;
LL ans = 0;
scanf("%lld", &N);
if (N == 0) {
printf("0");
return 0;
}
else {
len = count_len(N);
if (len == 1) {
printf("1");
return 0;
}
// pos_num=now_bit(1);
// num_of_left = left_num(5);
// num_of_right = right_num(5);
else {
while (now_len <= len) {
if (now_len == 1) {
pos_num = now_bit(now_len);
if (pos_num == 0) {
ans = left_num(now_len);
}
else {
ans = left_num(now_len) + 1;
}
}
else if (now_len == len) {
pos_num = now_bit(now_len);
if (pos_num == 1) {
ans += (right_num(now_len) + 1);
}
else {
ans += switch_to_ten_radix(now_len - 1);
}
}
else {
pos_num = now_bit(now_len);
if (pos_num == 0) {
ans += left_num(now_len)*switch_to_ten_radix(now_len - 1);
}
else if (pos_num == 1) {
ans += (left_num(now_len)*switch_to_ten_radix(now_len - 1) + right_num(now_len) + 1);
}
else {
ans += (left_num(now_len) + 1)*switch_to_ten_radix(now_len - 1);
}
}
now_len++;
}
}
printf("%lld", ans);
}
return 0;
}
三,标准代码
#include<cstdio>
using namespace std;
int main() {
int n = 0, ans = 0, a = 1;
int left = 0, now = 0, right = 0;
scanf("%d", &n);
while (n / a != 0) {
left = n / (a * 10);
now = n / a % 10;
right = n % a;
if (now == 0)ans += left*a;
else if (now == 1)ans += (left*a + right + 1);
else ans += (left + 1)*a;
a *= 10;
}
printf("%d", ans);
return 0;
}