• lightoj 1140


    Jimmy writes down the decimal representations of all natural numbers between and including m and n, (m ≤ n). How many zeroes will he write down?

    Input

    Input starts with an integer T (≤ 11000), denoting the number of test cases.

    Each case contains two unsigned 32-bit integers m and n, (m ≤ n).

    Output

    For each case, print the case number and the number of zeroes written down by Jimmy.

    Sample Input

    Output for Sample Input

    5

    10 11

    100 200

    0 500

    1234567890 2345678901

    0 4294967295

    Case 1: 1

    Case 2: 22

    Case 3: 92

    Case 4: 987654304

    Case 5: 3825876150

    题意:给你两个数m,n。问你在m~n之间0的个数。

    这题类似lightoj1032,只不过这题是求0的个数。求0的个数一定要考虑是否是首位,我们知道0不能为第一位,所以这题在搜索上就加一个判断

    条件,看一下搜索到的是否为首位。

    #include <iostream>
    #include <cstring>
    using namespace std;
    typedef long long LL;
    LL dp[33][33];
    LL dig[33];
    LL dfs(LL x , LL cnt , LL flag , LL first)
    {
        if(x == 0)
        {
            if(first)
                return 1;
            else
                return cnt;
        }
        if(dp[x][cnt] != -1 && !flag && !first)
            return dp[x][cnt];
        LL sum = 0;
        LL gg = flag ? dig[x] : 9;
        for(int i = 0 ; i <= gg ; i++)
        {
            if(first)
            {
                sum += dfs(x - 1 , cnt , i == gg && flag , first && i == 0);
            }
            else
            {
                if(i == 0)
                {
                    sum += dfs(x - 1 , cnt + 1 , i == gg && flag , 0);
                }
                else
                {
                    sum += dfs(x - 1 , cnt , i == gg && flag , 0);
                }
            }
        }
        if(!flag && !first)
            dp[x][cnt] = sum;
        return sum;
    }
    LL Gets(LL x)
    {
        memset(dig , 0 , sizeof(dig));
        int temp = 0;
        if(x == 0)
            dig[1] = 0;
        while(x)
        {
            dig[++temp] = x % 10;
            x /= 10;
        }
        return dfs(temp , 0 , 1 , 1);
    }
    int main()
    {
        int t;
        cin >> t;
        int ans = 0;
        while(t--)
        {
            ans++;
            LL n , m;
            memset(dp , -1 , sizeof(dp));
            cin >> n >> m;
            //cout << Gets(m) << ' ' << Gets(n - 1) << endl;
            cout << "Case " << ans << ": " << Gets(m) - Gets(n - 1) << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    win10系统打印图片中间空白的解决办法
    DELPHI SOKET 编程--使用TServerSocket和TClientSocket
    因为未启用行移动功能 不能闪回表
    oracle闪退(回退)功能
    查看oracle数据库的数据文件的目录
    Oracle
    Delphi : keydown与keypress的区别,组合键
    Delphi Xe 中如何把日期格式统一处理,玩转 TDatetime
    移除 IIS 的各种头信息
    sql server 通过 sql 查询数据库状态
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6008058.html
Copyright © 2020-2023  润新知