Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环不为'时递增;在某些测试用例中不起作用_Python_Python 3.x_Math_While Loop_Calculation - Fatal编程技术网

Python 循环不为'时递增;在某些测试用例中不起作用

Python 循环不为'时递增;在某些测试用例中不起作用,python,python-3.x,math,while-loop,calculation,Python,Python 3.x,Math,While Loop,Calculation,我必须定义一个函数,其中: 从一个正整数original开始,继续相乘original 通过n计算生成的所有倍数之和,包括 原始直到总和不再小于总计。归还 达到或高于此值所需的最小乘法次数 给定的总数 例如: 相乘直到总数达到(1,5,2) 1*2=2,(1+2)5,需要2次乘法 相乘直到总数达到(1,15,2) 1*2=2,(1+2)试试这个,更小更整洁。注释中有解释 def multiply_until_total_reached(original, total, n): s

我必须定义一个函数,其中:

从一个正整数
original
开始,继续相乘
original
通过
n
计算生成的所有倍数之和,包括
原始
直到总和不再小于
总计
。归还 达到或高于此值所需的最小乘法次数 给定的总数

例如:

  • 相乘直到总数达到(1,5,2)

    1*2=2,(1+2)5,需要2次乘法

  • 相乘直到总数达到(1,15,2)


    1*2=2,(1+2)试试这个,更小更整洁。注释中有解释

    def multiply_until_total_reached(original, total, n):
            sum = original    #Initialize sum to original
            mult_no = 0
    
            while sum < total:       #Will auto return 0 if original>=total
                sum += original*n    #Add original * n
                original = original*n   #Update the new original
                mult_no += 1    #Increase multiplications by 1
    
            return mult_no
    
    print multiply_until_total_reached(1,5,2)
    print multiply_until_total_reached(1,15,2)
    print multiply_until_total_reached(1,1038,2)
    
    #Output
    #2
    #3
    #10
    
    def乘法直到达到总数(原始、总计、n):
    sum=原始#将sum初始化为原始
    mult_no=0
    而sum=total,将自动返回0
    总和+=原始*n#添加原始*n
    原件=原件*n#更新新原件
    mult_no+=1#将乘法增加1
    返回mult_编号
    打印乘法直到达到总数(1,5,2)
    打印乘法直到达到总数(1,15,2)
    打印乘法直到达到总数(11038,2)
    #输出
    #2
    #3
    #10
    
    试试这个,小得多,整洁得多。注释中有解释

    def multiply_until_total_reached(original, total, n):
            sum = original    #Initialize sum to original
            mult_no = 0
    
            while sum < total:       #Will auto return 0 if original>=total
                sum += original*n    #Add original * n
                original = original*n   #Update the new original
                mult_no += 1    #Increase multiplications by 1
    
            return mult_no
    
    print multiply_until_total_reached(1,5,2)
    print multiply_until_total_reached(1,15,2)
    print multiply_until_total_reached(1,1038,2)
    
    #Output
    #2
    #3
    #10
    
    def乘法直到达到总数(原始、总计、n):
    sum=原始#将sum初始化为原始
    mult_no=0
    而sum=total,将自动返回0
    总和+=原始*n#添加原始*n
    原件=原件*n#更新新原件
    mult_no+=1#将乘法增加1
    返回mult_编号
    打印乘法直到达到总数(1,5,2)
    打印乘法直到达到总数(1,15,2)
    打印乘法直到达到总数(11038,2)
    #输出
    #2
    #3
    #10
    
    您的问题是在每次循环迭代中重新分配
    数字的总和。您只需在每次迭代中将
    multnum
    添加到
    sumofdigits
    sumofdigits+=multnum
    )。此外,您的循环条件需要固定为
    sumofdigits
    ,因为您必须“返回达到高于给定总数所需的最小乘法次数。”

    您的问题是,您在每次循环迭代中都要重新分配
    sumofdigits
    。您只需在每次迭代中将
    multnum
    添加到
    sumofdigits
    sumofdigits+=multnum
    )。此外,您的循环条件需要固定为
    sumofdigits
    ,因为您必须“返回达到给定总数上方值所需的最小乘法数。”

    因为您的代码的解决方案已经发布,并且您接受其他解决方案,请允许我提出以下建议,它充分利用了Python的>3.2
    acculate()
    函数:

    from itertools import accumulate, count
    
    def multiply_until_total_reached(original, total, n):
        for i, result in enumerate(accumulate(original*n**c for c in count())):
            if result >= total: return i
    
    assert multiply_until_total_reached(1,5,2) == 2
    assert multiply_until_total_reached(1,15,2) == 3
    assert multiply_until_total_reached(1,1038,2) == 10
    

    由于您的代码的解决方案已经发布,并且您接受其他解决方案,请允许我提出以下建议,这充分利用了Python的>3.2
    acculate()
    函数:

    from itertools import accumulate, count
    
    def multiply_until_total_reached(original, total, n):
        for i, result in enumerate(accumulate(original*n**c for c in count())):
            if result >= total: return i
    
    assert multiply_until_total_reached(1,5,2) == 2
    assert multiply_until_total_reached(1,15,2) == 3
    assert multiply_until_total_reached(1,1038,2) == 10
    

    您缺少一个
    total==原始
    案例。你应该有
    O(log n)
    解决方案,其中
    n
    表示
    total
    的值。。我的意思是O(logn),其中n是需要的乘法数:-P。。不过,在这种情况下,这可能有点过头了。。注意它是如何与一个GP的和相关的。@AbhishekJebaraj我知道,这可以在O(1)时间内使用GP公式和对数不等式来完成,尽管如果
    n
    介于0和1之间,这会稍微复杂一些,如果
    n
    为负,则根本不起作用。此解决方案保证适用于所有
    n
    。您缺少一个
    total==original
    案例。你应该有
    O(log n)
    解决方案,其中
    n
    表示
    total
    的值。。我的意思是O(logn),其中n是需要的乘法数:-P。。不过,在这种情况下,这可能有点过头了。。注意它是如何与一个GP的和相关的。@AbhishekJebaraj我知道,这可以在O(1)时间内使用GP公式和对数不等式来完成,尽管如果
    n
    介于0和1之间,这会稍微复杂一些,如果
    n
    为负,则根本不起作用。此解决方案保证适用于所有
    n
    。哦,好的,这很有意义。所以我必须删除第一个sumofdigits=multnum+原件,只使用sumofdigits+=multnum?TIA@Pritster5是的。哦,好吧,这很有道理。所以我必须删除第一个sumofdigits=multnum+原件,只使用sumofdigits+=multnum?TIA@Pritster5是的。虽然这以一种更简洁的方式解决了问题,但它并不能真正回答问题,也无助于OP理解。是的,如果他是一名学生,想学习并找出自己的错误,这不会有多大帮助。。但是如果他在工作,想要一些更整洁的代码和一个快速的答案,这对他会有很大帮助。老实说,我正在阅读这些代码,它对我来说非常有意义。这只是一种不同的(更快/更清洁)的方法来解决问题。我理解我的错误,正如邪恶德在下面解释的那样。虽然这以一种更简洁的方式解决了问题,但它并不能真正回答问题,也不能帮助OP理解。是的,如果他是一名学生,想要学习并找出他的错误,这将不会有多大帮助。。但是如果他在工作,想要一些更整洁的代码和一个快速的答案,这对他会有很大的帮助