V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Liang
V2EX  ›  PHP

如何从 1,2,3 通过公式得出 1,11,111

  •  
  •   Liang · 2016-05-18 11:01:03 +08:00 · 4804 次点击
    这是一个创建于 3148 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 业务的需要,现在要计算几个区间,具体是从 x 算出 min-max 。
    • 目前只想到的方法有两种,但都觉得不完美,不符合处女座程序员的风格。
    1. 拼凑,'1'+'1'+'1'=111
    2. 累加, 1+10+100=111 ( 1,10,100 是通过 10 的(x-1)次方算出来的)

    Alt text

    35 条回复    2016-05-18 18:29:46 +08:00
    Slienc7
        1
    Slienc7  
       2016-05-18 11:15:43 +08:00 via Android   ❤️ 1
    x 直接转 Binary 然后转文本?
    JiShuTui
        2
    JiShuTui  
       2016-05-18 11:20:23 +08:00   ❤️ 1
    在空字符串的左侧填充 x 个 1
    str_pad('', $x, '1', STR_PAD_LEFT)
    mcfog
        3
    mcfog  
       2016-05-18 11:23:27 +08:00   ❤️ 1
    难道不是 str_repeat 么 :doge:
    fds
        4
    fds  
       2016-05-18 11:23:55 +08:00   ❤️ 1
    直接读表
    moro
        5
    moro  
       2016-05-18 11:24:51 +08:00   ❤️ 1
    str_pad("", 3, 1)
    JiShuTui
        6
    JiShuTui  
       2016-05-18 11:25:58 +08:00   ❤️ 1
    @mcfog 对,应该用 str_repeat
    zongwan
        7
    zongwan  
       2016-05-18 11:28:01 +08:00   ❤️ 3
    min = (x * 10 - 1)/9
    max = min * 10
    zongwan
        8
    zongwan  
       2016-05-18 11:28:41 +08:00
    @zongwan
    <<< x * 10
    >>> x ** 10
    Liang
        9
    Liang  
    OP
       2016-05-18 11:29:37 +08:00
    @JiShuTui
    @mcfog
    @moro

    好吧,你们也是拼出来的字符串,不是一次得出整型。
    zongwan
        10
    zongwan  
       2016-05-18 11:29:39 +08:00
    @zongwan
    上面还是错了
    <<< x ** 10
    >>> 10 ** x
    Liang
        11
    Liang  
    OP
       2016-05-18 11:31:28 +08:00
    @zongwan

    哈哈哈,我就说算了几次没对。。。
    wdk23411
        12
    wdk23411  
       2016-05-18 11:37:15 +08:00
    min: (10^x-1)/9
    max: min*10
    debiann
        13
    debiann  
       2016-05-18 11:38:31 +08:00 via iPhone
    等比数列求和
    ryd994
        14
    ryd994  
       2016-05-18 11:41:58 +08:00 via Android
    循环左移累加啊
    sum=0
    for i 0 n
    _sum=sum*10+1
    imn1
        15
    imn1  
       2016-05-18 12:13:03 +08:00
    min 和 max 是 2 进制就简单了
    min:(1<<x)-1
    max:min<<1 或 (2<<(x+1))-2
    necomancer
        16
    necomancer  
       2016-05-18 12:29:53 +08:00
    for i in range(1, 4):
    m = eval('1' * i)
    M = m * 10
    print(m, M)

    1 10
    11 110
    111 1110
    dphdjy
        17
    dphdjy  
       2016-05-18 12:30:03 +08:00 via Android
    填充
    necomancer
        18
    necomancer  
       2016-05-18 12:34:11 +08:00
    或者
    [ (lambda x: (x, x*10))(eval('1'*x)) for x in range(1,4) ]
    输出
    [(1, 10), (11, 110), (111, 1110)]
    aprikyblue
        19
    aprikyblue  
       2016-05-18 12:58:20 +08:00 via Android
    min:
    数列{Ax}
    累加的通项 Ax= 10^(x-1)
    累加和 Sx=A1 + A2 + ... + Ax ,记为①
    把①两边同乘 10 ,得 10Sx = A1 *10 + A2 *10 + ... Ax *10
    整理得, 10Sx = A2 + A3 + ... Ax+1 ,记为②
    ②-①,得 9Sx= -A1 + Ax+1
    Sx = (-A1 + Ax+1)/9

    Sx = (-1 + 10^x)/9
    --------------------

    代入验证, S1=(-1+10)/9=1
    S2=(-1+100)/9=11
    S3=(-1+1000)/9=111
    est
        20
    est  
       2016-05-18 12:58:49 +08:00
    python 里很容易啊:

    x = 3

    int('1' * x)
    aprikyblue
        21
    aprikyblue  
       2016-05-18 13:01:05 +08:00 via Android
    Min(x)= (-1 + 10^x)/9 
    Max(x)= 10*Min(x) = 10(-1 + 10^x)/9
    chewuhe
        22
    chewuhe  
       2016-05-18 13:08:03 +08:00
    min = 2^(x-1)
    0xAdministrator
        23
    0xAdministrator  
       2016-05-18 13:36:04 +08:00 via Android
    min=2^n-1 然后转成 2 进
    max=2^(n+1)-2 转 2 进
    zhujinliang
        24
    zhujinliang  
       2016-05-18 13:45:34 +08:00
    查表啊,就算你 int64 ,也就是 18 种可能
    6david9
        25
    6david9  
       2016-05-18 15:09:19 +08:00
    geohash?
    lessball
        26
    lessball  
       2016-05-18 15:25:22 +08:00
    ((10^x) - 1) / 9
    suspended
        27
    suspended  
       2016-05-18 16:25:11 +08:00
    一个简单的求和数列嘛。

    n = 1, 2, 3, 4, ...
    min = 10^0 + 10^1 + 10^2 + ... + 10^(n-1)
    max = 10^1 + 10^2 + 10^3 + ... + 10^n
    xlogion
        28
    xlogion  
       2016-05-18 16:44:49 +08:00
    27 正解

    FOR 版本


    for ($i=$x; $i>0; $i--) $min+=pow(10,$i-1);

    var_dump($min);


    for ($i=$x; $i>0; $i--) $max+=pow(10,$i);

    var_dump($max);

    while 版本

    while ($x) {$min+=pow(10,$x-1);$x--;}

    while ($x) {$max+=pow(10,$x);$x--;}
    stormslowly
        29
    stormslowly  
       2016-05-18 16:50:57 +08:00
    明显 12 楼才是正解 构造数列经常用的技巧啊
    ffffwh
        30
    ffffwh  
       2016-05-18 17:08:37 +08:00
    f(n+1) = 10 * f(n) + 1
    f(n + 1) + 1/9 = 10 * (f(n) + 1/9)

    然后等比数列求解, 好吧我懵逼了算不对...
    还是问 wolframalpha: https://www.wolframalpha.com/input/?i=f(n)+%3D+10+*+f(n-1)+%2B+1,+f(1)+%3D+1
    ffffwh
        31
    ffffwh  
       2016-05-18 17:10:08 +08:00
    @ffffwh
    发现百度的时候眼花把求和公式看成通项...
    araraloren
        32
    araraloren  
       2016-05-18 17:23:29 +08:00
    @zhujinliang 就是,还不如查表呢,真正的`O(1)`时间复杂度!
    easing
        33
    easing  
       2016-05-18 18:02:17 +08:00
    12 楼就已经很简洁了啊
    22too
        34
    22too  
       2016-05-18 18:12:36 +08:00
    题目我都没看懂,

    python

    >>> “ 1 ” * 1
    >>> "1"
    >>> "1" * 2
    >>> "11"
    >>>"1" * 3
    >>>"111"
    sophymax
        35
    sophymax  
       2016-05-18 18:29:46 +08:00
    ~~~~~别打我 a=[1,11,111]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.