NC50522. 数字计数
描述
输入描述
仅包含一行两个整数a,b,含义如上所述。
输出描述
包含一行10个整数,分别表示在[a,b]中出现了多少次。
示例1
输入:
1 99
输出:
9 20 20 20 20 20 20 20 20 20
C++14(g++5.4) 解法, 执行用时: 2ms, 内存消耗: 480K, 提交时间: 2020-08-19 17:23:44
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 10; /* 001~abc-1, 999 abc 1. num[i] < x, 0 2. num[i] == x, 0~efg 3. num[i] > x, 0~999 */ ll get(vector<int> num, ll l, ll r) { ll res = 0; for (int i = l; i >= r; i -- ) res = res * 10 + num[i]; return res; } ll power10(ll x) { ll res = 1; while (x -- ) res *= 10; return res; } ll count(ll n, ll x) { if (!n) return 0; vector<int> num; while (n) { num.push_back(n % 10); n /= 10; } n = num.size(); ll res = 0; for (int i = n - 1 - !x; i >= 0; i -- ) { if (i < n - 1) { res += get(num, n - 1, i + 1) * power10(i); if (!x) res -= power10(i); } if (num[i] == x) res += get(num, i - 1, 0) + 1; else if (num[i] > x) res += power10(i); } return res; } int main() { ll a, b; cin>>a>>b; for (int i = 0; i <= 9; i ++ ) cout << count(b, i) - count(a - 1, i) << ' '; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 492K, 提交时间: 2020-06-01 09:18:48
#include<cstdio> long long a,b; long long pow[20],f[20]; long long ans[3][20]; void solve(long long x,int num) { long long s[20],len=0,ff=0; while(x) s[++len]=x%10,x/=10; for(int i=len;i>=1;i--) { ff=0; for(int j=0;j<=9;j++) ans[num][j]+=f[i-1]*s[i]; for(int j=0;j<s[i];j++) ans[num][j]+=pow[i-1]; for(int j=i-1;j>=1;j--) ff=ff*10+s[j]; ans[num][s[i]]+=ff+1; ans[num][0]-=pow[i-1]; } } int main() { scanf("%lld %lld",&a,&b); pow[0]=1; for(int i=1;i<=15;i++) { f[i]=f[i-1]*10+pow[i-1]; pow[i]=10*pow[i-1]; } solve(a-1,1); solve(b,2); for(int i=0;i<=9;i++) printf("%lld ",ans[2][i]-ans[1][i]); return 0; }