列表

详情


NC50522. 数字计数

描述

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

输入描述

仅包含一行两个整数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;
}

上一题