AcWing 338. 计数问题
原题链接
中等
作者:
阿飞被注册了
,
2021-06-03 21:06:03
,
所有人可见
,
阅读 295
详解都在代码里面了
C++ 代码
//回首上学期还是只会最暴力的解法,结果就是无限T 算法路上都是泪 qwq
//例:找1-abcdefg 中x出现的次数(在百位的情况)
//1. x!=0:当x在百位的情况如下:
// 1.1 前四位!=abcd:
// ans = (0~abcd-1 == abcd种情况)--> abcd * 100 <--(后两位:0~99 == 100)
// 1.2 前四位==abcd:
// 1.2.1 百位的e==x时:ans = fg+1(后两位:0~fg)
// 1.2.2 百位的e>x时: ans = 100 (后两位:0~99)
//2. x==0:当x在百位的情况如下:
// 2.1 前四位!=abcd:
// ans = (1~abcd-1 == abcd-1种情况)-->(abcd-1) *100 <--(后两位:0~99 == 100)
// 2.2 前四位==abcd:
// 2.2.1 百位的e==x时:ans = fg+1(后两位:0~fg)
// 1.2.2 百位的e>x时: ans = 100 (后两位:0~99)
//综上:x==0与x!=0只在第一种情况有差别:x==0比x!=0少100; 所以先全按x!=0算,若x==0再减去多的100种。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int power10(int i)
{
int res = 1;
while(i--)
res *= 10;
return res;
}
int get(vector<int> ve, int r, int l)
{
int res = 0;
for(int i = l; i >= r; i--)
res = res *10 + ve[i];
return res;
}
int count(int u, int x)
{
if(!u) return 0;
vector<int> ve;
while(u)
{
ve.push_back(u%10);
u /= 10;
}
int n = ve.size();
int res = 0;
for(int i = n - 1 - !x; i >= 0; i--)
{
res += get(ve, i+1, n-1) * power10(i);
if(!x) res -= power10(i);
if(ve[i] == x) res += get(ve, 0, i-1) + 1;
else if(ve[i] > x) res += power10(i);
}
return res;
}
int main()
{
int a, b;
while(cin >> a>> b, a || b)
{
if(a > b) swap(a, b);
for(int i = 0; i < 10; i++)
cout << count(b, i) - count(a-1, i) << ' ';
cout << '\n';
}
return 0;
}