之前面试时遇到的一个有些奇怪的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
KomiSans
V2EX    程序员

之前面试时遇到的一个有些奇怪的问题

  •  
  •   KomiSans
    KomiSans 2021-10-08 16:11:32 +08:00 4683 次点击
    这是一个创建于 1468 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1000/1+1000/2+1000/3+...+1000/n=10000 求 n 是多少(面试的 nodeJS) 我因为理解能力比较差所以先写了一下具体的实现方法 如图:

    5CLRqH.jpg

    仅仅觉得有些奇怪 自己的写法也很奇怪

    31 条回复    2021-10-11 10:23:27 +08:00
    mxT52CRuqR6o5
        1
    mxT52CRuqR6o5  
       2021-10-08 16:20:11 +08:00 via Android
    所以你求出来 n 是多少? 10000?
    KomiSans
        2
    KomiSans  
    OP
       2021-10-08 16:21:46 +08:00
    @mxT52CRuqR6o5 10000 肯定不对啊 10000 是总和...
    lisianthus
        3
    lisianthus  
       2021-10-08 16:25:31 +08:00
    算出来 n = 12367 的时候,总和是 10000.043008275803,n 不是整数
    dvsilch
        4
    dvsilch  
       2021-10-08 16:35:54 +08:00
    每次加一个数不就行了

    如果当前 n - 1 项总和 sum 小于 10000,那 sum 就再加上 1000 / n 再判断一次
    noe132
        5
    noe132  
       2021-10-08 16:39:51 +08:00
    https://www.wolframalpha.com/input/?i2d=true&i=solve+xSum%5BDivide%5B1000%2Cn%5D%2C%7Bn%2C1%2Cx%7D%5D+%3D+10000+x+%3E+0


    解出来 x 并不为整数,约等于 12366.5
    所以 12366 时小于 10000,12367 时大于 10000
    KomiSans
        6
    KomiSans  
    OP
       2021-10-08 16:41:22 +08:00
    我感觉我的解题思路总是那么谜
    013231
        7
    013231  
       2021-10-08 17:07:03 +08:00
    不限定语言和库的话...

    >>> import numpy as np
    >>> print(np.argmax(np.cumsum(1 / np.arange(1, np.exp(10))) > 10))
    12366

    n 等于 12367 时,数列和首次超过 10000.
    上面的式子中用 np.exp(10)限制搜索的上限,为什么可以做如此限定,请自行搜索“partial sum of the harmonic series”。
    zydxn
        8
    zydxn  
       2021-10-08 17:09:19 +08:00
    确定问的不是大于等于 10000 的临界值吗
    jorneyr
        9
    jorneyr  
       2021-10-08 17:12:35 +08:00   2
    1000/1+1000/2+1000/3+...+1000/n=10000
    =>
    1000 * (1 + 1/2 + 1/3 + ... + 1/n)
    因为 1+1/2+1/3+1/4+...+1/2007+1/2008=ln(2008)+C=8.1821 (约),C 为欧拉常数 数值是 0.5772
    =>
    Ln(N)+C=10000

    最终是一个数学问题。如果使用迭代逐项计算,得分不高,如果转换为数学问题则会加分不少。
    jorneyr
        10
    jorneyr  
       2021-10-08 17:14:13 +08:00   2
    利用“欧拉公式”:1+1/2+1/3+……+1/n=ln(n)+C,C 为欧拉常数 数值是 0.5772
    KomiSans
        11
    KomiSans  
    OP
       2021-10-08 17:17:03 +08:00
    @jorneyr 数学家思维 我这个单纯是为了验证我的写法对不对
    MoYi123
        12
    MoYi123  
       2021-10-08 17:18:17 +08:00   1
    明显 n 越大, 计算出的答案越大, f(n) 是一个单调函数.
    所以用二分法可解
    MoYi123
        13
    MoYi123  
       2021-10-08 17:29:44 +08:00
    不对,sb 了,求这个函数结果的过程中就能得到答案了,如果不用上面的数学做法,二分法反而慢了.
    crayygy
        14
    crayygy  
       2021-10-08 17:32:21 +08:00   2
    等式两边同除 1000 以后就是调和级数了 https://zh.wikipedia.org/wiki/%E8%B0%83%E5%92%8C%E7%BA%A7%E6%95%B0
    jxxz
        15
    jxxz  
       2021-10-08 17:39:49 +08:00
    ```
    target = 10000
    n = 1
    now = 0

    while True:
    if now >= target:
    break
    now += 1000/n
    n += 1


    print(n)
    ```

    这样吗 随便写了下
    jxxz
        16
    jxxz  
       2021-10-08 17:47:46 +08:00
    又看了下 判断顺序有点问题 break 判断放 now+=下面,差不多这个意思
    fhl
        17
    fhl  
       2021-10-08 18:29:24 +08:00
    let sum = 0;
    let num = 0;

    while(sum <= 10000) {
    num++;
    sum += 1000 / num;
    }

    console.log(num);
    fhl
        18
    fhl  
       2021-10-08 18:34:26 +08:00
    @fhl 果然需要换成算法解,换成 100000 纯计算就没边了
    longgediyi999
        19
    longgediyi999  
       2021-10-08 18:36:36 +08:00
    let start = 0

    for (let index = 1; index <= Infinity; index++) {
    start += 1000 / index
    if (start > 10000) {
    console.log(start, index)
    return
    }
    }
    ccde8259
        20
    ccde8259  
       2021-10-08 18:38:34 +08:00 via iPhone
    调和级数的近似+二分 /牛顿
    BiChengfei
        21
    BiChengfei  
       2021-10-08 19:16:00 +08:00
    如果不局限于 JS,也可能考察数据类型吧
    整形 / 整形,得到的是整形,永远不可能等于 10000

    算法解是很牛,如果是普通职位,面试官都不一定知道,或许只是想考验你数据类型、临界值处理、需求沟通、需求判断能力
    SoloCompany
        22
    SoloCompany  
       2021-10-08 20:42:57 +08:00
    @jorneyr C 取 0.5772 的精度不够, Math.exp(10 - 0.5772) = 12367.161838810916 得到的结果大了 1, 要再多两位的精确度 0.577215 才能得到正确的结果 12366.976332774619

    默认题目要求应该是精确值而不是约数, 那么迭代应该是最优解
    nicehyj
        23
    nicehyj  
       2021-10-08 20:50:25 +08:00
    这玩意有点像斐波那契数列
    nuobao
        24
    nuobao  
       2021-10-08 21:57:43 +08:00
    感觉你们想太复杂了?
    '''go
    func Test2110082149(t *testing.T) {
    sum := 0
    for n := 1; n < math.MaxInt64; n++ {
    sum += 1000 / n
    if sum == 10000 {
    fmt.Println(n)
    return
    }
    }
    }
    '''
    跑了 10 秒没跑出结果,此题无解
    nuobao
        25
    nuobao  
       2021-10-08 22:06:08 +08:00
    按题目意思,n 是整数
    liuidetmks
        26
    liuidetmks  
       2021-10-09 05:27:22 +08:00 via iPhone
    刚百度了下,除了 n=1 时以外,没有任何一个调和数是整数

    这什么岗位?
    whosesmile
        27
    whosesmile  
       2021-10-09 11:14:58 +08:00
    n=1 啊,这还写什么程序?
    换个思路,左右等式全部用 1 除,然后你就发现了,只能是 1 了啊
    MissThee
        28
    MissThee  
       2021-10-09 11:38:07 +08:00
    @whosesmile n=1 等式不就成 1000/1=10000 了。。。
    whosesmile
        29
    whosesmile  
       2021-10-09 14:35:20 +08:00
    @MissThee 给我问懵逼了,任何数除以 1 等于它本身,这不对吗?
    Frankcox
        30
    Frankcox  
       2021-10-09 15:00:04 +08:00
    @whosesmile 左边是 1000,右边是 10000,,,,,,
    whosesmile
        31
    whosesmile  
       2021-10-11 10:23:27 +08:00
    @Frankcox @MissThee 尴尬,惭愧惭愧, 看错了...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1256 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:47 PVG 07:47 LAX 16:47 JFK 19:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86