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;
}