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]<<" ";
    }
  • 相关阅读:
    如何制作a2sd+
    WinForm/Silverlight多线程编程中如何更新UI控件的值
    c#如何操作cookie
    Windows Mobile CookieContainer
    Microsoft.Practices.EnterpriseLibrary.Data 数据库操作
    获取手机卡imei和imsi信息
    winform 分页控件
    asp.net 导出数据到Excle
    asp.net异步调用
    shell脚本中常用命令
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10908508.html
Copyright © 2011-2022 走看看