• #C++初学记录(算法3)


    C - 不要62 **
    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
    杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
    不吉利的数字为所有含有4或62的号码。例如:
    62315 73418 88914
    都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
    你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
    Input**
    输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
    Output
    对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
    Sample Input
    1 100
    0 0
    Sample Output
    80
    运行代码

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    int dp[10][10];
    int a[10];
    int f(int m)
    {
        int x=0, y=0;
        while(m) 
    	{
            y++;
            a[y] = m % 10;
            m = m / 10;
        }
        a[y+1] = 0;
        for(int i=y; i>=1; i--) 
    	{
            for(int j=0; j<a[i]; j++) 
                if(a[i+1]!=6 || j!=2)
                    x = dp[i][j] + x;
            if(a[i]==4 || (a[i+1]==6 && a[i]==2)) break;
        }
        return x;
    }
     
    int main()
    {
        int n, m;
        dp[0][0] = 1;
        for(int i = 1; i <= 7; ++i)
            for(int j = 0; j <= 9; ++j)
                for(int k = 0; k <= 9; ++k)
    				if(!(j==6 && k==2) && j!=4)
                        dp[i][j] += dp[i-1][k];
        while(scanf("%d %d", &n, &m)) 
    	{
            if(n==0 && m==0) break;
            printf("%d
    ", f(m+1) - f(n));
        }
        return 0;
    }
    

    代码理解
    经过思考这个问题首要想到的是对输入的字符串进行分割然后存入数组,既123456分割成“1”“2”等等,进行储存,最好使用动态数组或空间小的动态数组,避免开的数组太多占用太多内存。存入数据后则进行判断,一次判断两位,若出现4或者62则跳过进行下一次运行,若两位判断不出4或者62则删除一位再次进行两位判断。直到最后所有判断完毕得出判断不含有4或者62的次数。

  • 相关阅读:
    vue中的Data为什么必须是一个函数
    单页面应用的优缺点
    数组去重
    mvvm框架
    前端计算精确度问题处理JS
    shell 修改json配置。
    ubuntu 两个文件夹合并
    fdisk、df与du的区别
    新买移动磁盘,使用前需要什么操作?
    Springboot+MybatisPlust+ControllerAdvice ;Mybatis_Plus多数据源,controller统一异常返回
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/10706687.html
Copyright © 2020-2023  润新知