PAT(A)1049 Counting Ones (30分)(数学思维)

在这里插入图片描述

Sample Input

12

Sample Output

5

思路:
题意简单,数从0到这个数之间到底有多少1。
直接暴力不可取。。。TLE
数学思维上阵(参考别人)
位操作,从左到右。
当前位 = 0:ans += l * p(位数)
当前位 = 1:ans += l * p + r + 1
当前位 > 1:ans += l * p + p
代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>

using namespace std;

typedef long long ll;

int main()
{
    string str;
    cin >> str;

    ll ans = 0;

    for (int i = 0; i < str.size(); ++i)
    {
        ll l = 0, r = 0, p = 1;
        for (int j = 0; j < i; ++j) l = l * 10 + str[j] - '0';
        for (int j = i + 1; j < str.size(); ++j)
        {
            r = r * 10 + str[j] - '0';
            p *= 10;
        }
        ans += l * p;
        if (str[i] == '1')
            ans += r + 1;
        else if (str[i] > '1')
            ans += p;
    }
    printf("%lld", ans);
    // getchar(); getchar();
    return 0;
}

发布了161 篇原创文章 · 获赞 7 · 访问量 7105

猜你喜欢

转载自blog.csdn.net/weixin_43778744/article/details/103952733