zoukankan      html  css  js  c++  java
  • 奥数 --- 找规律 + 总结

    问题 G: 数字的个数

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 78  解决: 3
    [提交][状态][讨论版]

    题目描述

    输入两个正整数a,b(1=<a<b<=1000000)及0~9的一个数字d
    求在a与b之间的所有正整数(含a,b)中数字d出现的次数

    输入

    第一行一个数T(1 <= T <= 10000)
    接下来 T 行每行由  
     a b d 三个数组成

    输出

    输出这组数据a与b之间所有正整数中数字d出现的个数,一
     行一个

    样例输入

    2 
    1 100 1
    10000 20000 5

    样例输出

    21
    4000

    【题目来源】

    湖南工业大学第四届程序设计大赛(2014年校赛)

    【题目分析】

    这题在编程之美上有,只不过是换了一下数字,还有这题当判断0的个数时要加一个特判,否则会错。

    其实就是利用高位、当前位、低位之间的关系,具体推导过程详见编程之美。

    我的代码:

    #include<iostream>
    using namespace std;
    int fun(int a,int d)
    {
        int cnt=0,factor=1,CurrNum=0,LowerNum=0,HigherNum=0;
        while(a/factor)
        {
            HigherNum=a-(a/factor)*factor;
            CurrNum=(a/factor)%10;
            HigherNum=a/(factor*10);
            if(d==0)      //特判,这题的重点
                HigherNum-=1;
            if(CurrNum<d)
                cnt+=HigherNum*factor;
            else if(CurrNum==d)
                cnt+=HigherNum*factor+LowerNum+1;
            else
                cnt+=(HigherNum+1)*factor;
            factor*=10;
        }
        return cnt;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int a,b,d;
            cin>>a>>b>>d;
            cout<<fun(b,d)-fun(a-1,d)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    GIT
    JS常用功能
    prop checkbox 是否选中的问题。
    关于 未能加载文件或程序集“MySql.Web.v20 ...... 的问题
    Codeforces Round #535(div 3) 简要题解
    [Codeforces 600E] Lomsat gelral
    [PA 2011] Journeys
    [HNOI 2012] 永无乡
    [ONTAK2010] Peaks
    [BZOJ 3307] 雨天的尾巴
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3739142.html
Copyright © 2011-2022 走看看