zoukankan      html  css  js  c++  java
  • P2602 [ZJOI2010]数字计数

    题目描述

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

    输入输出格式

    输入格式:

    输入文件中仅包含一行两个整数a、b,含义如上所述。

    输出格式:

    输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

    ————————————————————————————————————

    对每一位的统计,维护两个数组

    #include<bits/stdc++.h>
    using namespace std;
    long long int cnta[9],cntb[9],f[13],ten[13],a,b;
    void work1(long long int nt)
    {
        long long int num[13]={0},len=0;
        while(nt){num[++len]=nt%10;nt=nt/10;}
        for(int i=len;i>=1;i--)
        {
        for(int j=0;j<=9;j++)cnta[j]+=f[i-1]*num[i];
        for(int j=0;j<num[i];j++)cnta[j]+=ten[i-1];
        long long ans=0;
        for(int j=i-1;j>=1;j--)ans=ans*10+num[j];
        cnta[num[i]]+=ans+1;
        cnta[0]-=ten[i-1];
        }
    }
    void work2(long long int nt)
    {
        long long int num[13]={0},len=0;
        while(nt){num[++len]=nt%10;nt=nt/10;}
        for(int i=len;i>=1;i--)
        {
        for(int j=0;j<=9;j++)cntb[j]+=f[i-1]*num[i];
        for(int j=0;j<num[i];j++)cntb[j]+=ten[i-1];
        long long ans=0;
        for(int j=i-1;j>=1;j--)ans=ans*10+num[j];
        cntb[num[i]]+=ans+1;
        cntb[0]-=ten[i-1];
        }
    }
    int main()
    {
        ten[0]=1;
        for(int i=1;i<=12;i++){f[i]=i*ten[i-1];ten[i]=ten[i-1]*10;}
        for(int i=1;i)
        cin>>a>>b;
        work1(a-1);
        work2(b);
        for(int i=0;i<=9;i++)
        cout<<cntb[i]-cnta[i]<<" ";
    }
  • 相关阅读:
    秒杀多线程第十篇 生产者消费者问题 (续)
    平面最近点距离问题(分治法)
    阿里神马搜索算法实习生 二面
    37. Sudoku Solver
    52. N-Queens II(数个数)
    51. N-Queens
    89. Gray Code(公式题)
    22. Generate Parentheses(回溯)
    回溯总结
    40. Combination Sum II
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10908508.html
Copyright © 2011-2022 走看看