找“taxiNumber”程序,想换嵌套为循环优化的原因

2024-10-04 05:34:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始编程一周前,所以请原谅混乱你即将看到 我试图找到第一个x出租车号码,但与我的“嵌套为循环”的程序需要很长时间来通过所有的可能性。 出租车号码: 如果有一个数a^3+b^3等于c^3+d^3 那是一个计程车号码。例子 12^3+1^3==10^3+9^3==1729

对我来说,如果我能找到大约20个出租车号码,那就是成功了 事先谢谢你的任何提示或窍门!你知道吗

这是我的密码:

import math    

def main():    
    numbersOfResultsToFind = getNumberOfTaxisToFind()
    foundResults = 0
    numberToCheck = 1    
    while(foundResults < numbersOfResultsToFind):
        result = getTaxi(numberToCheck)
        if len(result) > 1: #if more then one a+b
            foundResults = foundResults + 1
            print(numberToCheck, result)
        numberToCheck = numberToCheck + 1

def getNumberOfTaxisToFind():
    return int(input("How many taxinumbers do you want to find? "))                           

def getThirdSquareFloored(value):
    value = value**(1/3)
    value = math.floor(value) #floor value
    return value    

def getTaxi(numberToCheck):
    result = []
    upperLimit = getThirdSquareFloored(numberToCheck)
    for a in range(1, upperLimit+1):
        for b in range(1, upperLimit+1):                                                          
            aCubed = a**3
            bCubed = b**3
            sumCub = aCubed + bCubed            
            if(sumCub == numberToCheck and a < b):
                result.append((a, b))
    return result   

main() 

Tags: returnifvaluemaindefmathresult号码
2条回答
import math           

def main():  
    numbersOfResultsToFind = getNumberOfTaxisToFind()
    foundResults = 0
    numberToCheck = 1 
    while(foundResults < numbersOfResultsToFind):
        result = getTaxi(numberToCheck)
        if len(result) > 1:
            foundResults = foundResults + 1
            print(numberToCheck, result)
        numberToCheck = numberToCheck + 1


def getNumberOfTaxisToFind():
    return int(input("How many taxinumbers do you want to find? "))


def getThirdSquareFloored(value):
    value = value**(1./3)
    value = math.floor(value)
    return value   

def getTaxi(numberToCheck):
    result = []
    upperLimit = getThirdSquareFloored(numberToCheck)
    for a in range(1, upperLimit+1):
        b = round((numberToCheck-a**3)**(1./3))
        if(a**3+b**3 == numberToCheck and a < b):
            result.append((a, b))
            if len(result) == 2:
                break
    return result
main() 

非常感谢你的帮助!这是我更新的代码,运行速度更快。我将b值设置为从a计算,而不是使用嵌套for循环。我还实现了一个if len(result),在代码末尾中断 如果已经找到一对,就没有理由继续寻找

问题是Taxicab numbers相距很远。你可以做一些数学技巧来解决它。例如,您可以检查Euler's sum of powers。这种方法的问题是,您将生成一些出租车号码,但它们可能不按顺序排列。你知道吗

关于你的代码,我有一些注释:

  1. 如果你想取立方根,不要做value**(1/3)!记住1/3 = 0在python中。使用1./3或使用numpy
  2. 根本不要使用**(1./3)任何幂函数都是昂贵的,试着用一些东西(预先计算的值)代替它们你知道吗
  3. 重要:Read StackOverflow if there is a solution already!

相关问题 更多 >