您的位置:首页 > 其它

pat 甲级 1049. Counting Ones (30)

2018-03-13 20:32 501 查看

1049. Counting Ones (30)

时间限制
100 ms

内存限制
65536 kB

代码长度限制
16000 B

判题程序
Standard

作者
CHEN, Yue

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
思路:
对于一个数的abcde,先计算其中的某一位上出现1的个数,不妨考虑百位上的c,若c为0,则百位上出现1的个数和c的高位ab有关,具体个数是ab*digit,这里c是在百位上,那么digit为100;
若c=1,则百位上出现1的个数为(ab*digit)+de+1,其中de为abcde中c的低位.9=>c>=2时,百位上出现1的个数为(ab+1)*digit.
AC代码:


#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 0x3f3f3f
#define N_MAX 200+5
#define M_MAX 100000+20
typedef long long ll;
int n ,cnt = 0;
int Count(int n) {
int cnt = 0,digit=1;
while (n / digit != 0) {
int higher = n / (digit * 10);
int lower = n - (n / digit)*digit;//!!
int cur = n / digit % 10;
switch (cur){
case 0:
cnt += higher*digit;
break;
case 1:
cnt += higher*digit + lower + 1;
break;
default:
cnt += (higher + 1)*digit;
break;
}
digit *= 10;
}
return cnt;
}

int main() {
while (cin>>n) {
cnt = Count(n);
cout << cnt << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: