zoukankan      html  css  js  c++  java
  • Lucky number[SRM403DIVI250]

    1.最简单的办法就是用递归来实现。以生成由4,7,9三个数组成,且不超过MAX_NUMBER、不小于MIN_NUMBER的数的个数:
    int number(long x) {
        
    if(x > MAX_NUMBER)
            
    return 0;
        
    if(x > MIN_NUMBER)
            cout 
    << x << endl;
        
    return number(x*10 + 4+ number(x*10 + 7+ number(x*10 + 9+ (x >= MIN_NUMBER ? 1 : 0);
    }
    number()返回值是符合条件的数的个数。
    用此种方法比较通用,解SRM_403_DIV1_250最为简单。

    2.因题中仅要求2个数,因此可以用2进制位构造出所有由这两个数组成的数。
     1forint k = 1; k <=9; k++ ) {
     2    forint i = 0; i < 1 << k; i++ ) {
     3        vec.clear();
     4        // generate the lucky number
     5        for(int j = 1, index = 0; index < len; j <<= 1, index++{
     6            if( (j & i) == 0 )
     7                vec.push_back('4');
     8            else
     9                vec.push_back('7');
    10        }

    11        vec.push_back('\0');
    12        int num = atoi(&vec[0]);
    13        if( a <= num && num <= b )
    14            count++;
    15    }

    16}
    其中,k是用来控制每次生成的数的长度的,最多不超过9。

    3. 划分成多个区间
        如果a和b长度相同,则仅需要双重循环i和j即可。
        如果不相同,则只需要计算区间(a, maxnumber of length(a)) + (minnumber of length(b), b) + 长度处于[length(a)+1,length(b)-1]之间的数的个数。后一部分的算法为count = 1 << length; length属于[length(a)+1,length(b)-1]

    附原题(From TopCoder)
  • 相关阅读:
    浅析软件开发项目的前期沟通工作
    .net core 和 WPF 开发升讯威在线客服系统:实现对 IE8 的完全完美支持 【干货】
    产品的定价策略(一):想通过产品挣钱,首先你产品的目标客户得不差钱
    .net core 和 WPF 开发升讯威在线客服系统:使用线程安全的 BlockingCollection 实现高性能的数据处理
    .net core 和 WPF 开发升讯威在线客服系统:使用 TCP协议 实现稳定的客服端
    .net core 和 WPF 开发升讯威在线客服系统:使用 WebSocket 实现访客端通信
    Centos上配置两层nginx转发,把请求转发到外网
    真实字节二面:什么是伪共享?
    关于MVCC,我之前写错了,这次我改好了!
    从家庭主妇到格力老总,董明珠的大女主逆袭之路
  • 原文地址:https://www.cnblogs.com/dust/p/1211222.html
Copyright © 2011-2022 走看看