您的位置:首页 > 其它

51 nod 1009 数字1的数量

2016-07-28 14:43 337 查看
1009 数字1的数量

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。

例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。

Input

输入N(1 <= N <= 10^9)

Output

输出包含1的个数

Input示例

12

Output示例

5

思路:

去计算每个位置上1出现的次数!这个次数与这个位置上的数字和前后的数字有关系。想清楚就好了。

假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。

如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,

比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。

等于更高位数字乘以当前位数,即12 * 100。

如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,

百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。

等于更高位数字加1乘以当前位数,即(12 + 1)*100。

如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,

受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,

出现1的情况是12100~12113,共114个,等于低位数字113+1。

#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;

int CountOne(int n) {
int cnt = 0;
int i = 1;
int current = 0, after = 0, before = 0;
while ((n / i) != 0) {
current = (n / i) % 10;//当前的数
before = n / (i * 10);//前面的数
after = n - (n / i) * i;//后面的数
if (current > 1)
cnt = cnt + (before + 1) * i;
else if (current == 0)
cnt = cnt + before * i;
else if (current == 1)
cnt = cnt + before * i + after + 1;
i = i * 10;
}
return cnt;
}
int main()
{
int n;
while(cin>>n){
int res=CountOne(n);
cout<<res<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: