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;
    }
  • 相关阅读:
    [置顶] 算法设计基础
    .net 多线程学习
    如何获得Repeater中的列
    npoi导出excel
    字符串的格式化问题
    用线程修改页面中的值(一)
    正则表达式的验证数值验证
    .net 线程更新页面中的值(方法二)
    .net 线程更新页面中的值(方法一)
    字符串的分割
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3739142.html
Copyright © 2011-2022 走看看