【问题标题】:given a number p, print value of n at which sum of (1/1 + 1/2 + ... + 1/n) is greater than p给定一个数字 p,打印 n 的值,其中 (1/1 + 1/2 + ... + 1/n) 的总和大于 p
【发布时间】:2021-12-30 10:37:51
【问题描述】:

给定一个数字'p',开发一个逻辑并编写一个Python程序来确定倒数之和(1 + 1/2 + 1/3 + ⋅⋅⋅ + 1/n)中的最小整数“n” ) 使总和大于“p”。打印 'n' 的值和总和 's'。

例如,当 p=3 时,倒数之和继续相加,直到 s 的值大于 3 即 n 为 11

p=int(input())
new=0
for i in range(1,1000000):
    term=1/i
    sum1=new+term
    new=sum1
    if sum1>p:
        print(i,sum1)
        break

我对如何设置范围上限有疑问。我如何决定要放什么?

【问题讨论】:

    标签: python loops for-loop if-statement


    【解决方案1】:

    我对如何设置范围上限有疑问。我如何决定要放什么?

    很高兴您已经认识到这是代码中的一个潜在问题!答案是:你知道你可能需要运行多少次这个循环。所以无法确定上限是多少。

    for 循环在您知道要循环多少次时很有用。当您不确定应该循环多少次时,是否可以使用另一种循环?

    【讨论】:

    • 哈哈,这很有趣。我今天学到了关于iter 的新东西!
    • 虽然我同意这不是“有用的”,只是“可能的”:-)。 Maybe a more reasonable one.
    • 又一个新东西,酷!我会使用from operator import truediv。由于1.__truediv__ 是一个语法错误,我一直认为您无法从整数中获取属性。但显然你只需要一个空间
    • 不过,您将如何完成呢? itertools.repeat1还是functools.partial呢?我尝试过的另一种选择是accumulate(1 / n for n in count(1)),但我不喜欢在内部和外部都使用n(我已经不高兴写两次1)。哦,好吧,最后这一切都只是为了好玩,在这种情况下他们真的不应该使用for
    【解决方案2】:

    您可以使用带有停止条件的无限循环while True

    import itertools
    
    p = 3
    n, total = 0, 0
    while True:
        n += 1
        total += 1 / n
        if total > p:
            break
    
    print(n) # 11
    

    另一种方法是使用itertools.count 生成无限for 循环,并在满足条件时停止它(breakreturn):

    import itertools
    
    def first_greater(p):
        total = 0
        for i, x in enumerate(itertools.count(1), start=1):
            total += 1 / x
            if total > p:
                return i
    
    print(first_greater(3)) # 11
    

    更精简的版本(或“函数式编程”方法):您可以使用itertools.countitertools.dropwhile(或itertools.takewhile

    import itertools
    
    p = 3
    series = itertools.accumulate(1 / x for x in itertools.count(1))
    greaters = itertools.dropwhile(lambda x: x[1] <= p, enumerate(series, start=1))
    print(next(greaters)[0]) # 11
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2021-08-30
      • 2022-11-13
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多