索引超出数学函数的范围

时间:2014-12-08 21:44:08

标签: python

以下是我认识的一些用Java学习的东西。我想通过选择一个非常复杂的方法并仅使用循环,if语句以及在对象,类,递归之类的东西之前学习的其他基本Python内容来挑战自己。

我需要取一个大于1的数字作为输入,在这种情况下我限制为最多30,直到我的功能正常工作。该函数需要输出一个数字,该数字是找到两个数字相乘以产生原始输入数字的结果(例如,输入21的3和7),其连接数字也将输入数字作为其产品,通过确保如果您将每个数字从左到右依次乘以下一个数字,您还将生成原始输入数字。

在此函数可以提供的所有可能输出中,函数最终选择最小数字并将其作为输出。因此,即使144 要提供成功的输出数字,它也不会使用12,12对,因为输出将是1212并且肯定有另一对(例如2,72)较小的最终输出。

实施例

>>> thing(21)
37

>>> thing(144)

可能没什么用,对吗?因此,这将返回NoneFalse或向用户提供失败消息。

如果不是因为连接这对数字而产生输入数字而产生的数字的数字规则,则输入144将返回/打印1212.但是,由于规则,1 x 2 x 1 x 2 = 4而不是144,因此它不起作用。

我收到有关字符串索引超出范围的错误。

def thing(n):
    list1 = []
    list2 = []
    calc = False
    count = 0
    if n > 1 and n < 30:
        for x in range(1, n + 1):
            for y in range(1, n + 1):
                if (x * y) == n:
                    list1.append([x, y])
                    for pair in list1:
                        digits = str(pair[0]) + str(pair[1])
                        holder = int(digits[count])
                        while count < (len(digits) - 1):
                            holder *= int(digits[count+1])
                            count += 1
                            if count == len(digits)-1:
                                if holder == n:
                                    list2.append(holder)
                                    calc = True
                                    count = 0
                                else:
                                    count = 0
    else:
        print("Input invalid.")
    if calc:
        print(min(list2))
    else:
        print("No such number.")

我正在使用这种低效且复杂的方法故意并考虑进行培训。

但是,我仍然乐于接受建议,不仅要在自己的方法中改进这些代码,还要 建议以更高级别的方式用更少的行来编写它。

有可能即使使用低级Python知识来解决这个问题,我也错过了一个更短的方法。我知道即使在我的方法中,我也可以把它缩短几行,也许少一些变量,这样的东西,但到目前为止我只是试图让它先工作。

注意:我不是来自数学背景。 (我可以在没有任何高级数学的情况下在行业中取得成功吗?)

2 个答案:

答案 0 :(得分:1)

我相信在count != len(digits)-1count未重置为零的情况下会发生这种情况,导致下一次迭代中出现索引错误。我认为你正在寻找类似的东西:

                    if count == len(digits)-1:
                        if holder == n:
                            list2.append(holder)
                            calc = True
                            count = 0
                        else:
                            count = 0
                    else:
                        count = 0

此外,代码末尾的while循环似乎将永远运行,因为您在while检查其条件之前将计数设置为零。在那种情况下:

                while count < (len(digits) - 1):
                    holder *= int(digits[count+1])
                    count += 1
                    if count == len(digits)-1:
                        if holder == n:
                            list2.append(holder)
                            calc = True
                count = 0

将是您的解决方案。

答案 1 :(得分:0)

我修好了!谢谢你的帮助,伙计们!

我还要重申,我正在寻找帮助我解决问题的方法,并以更好的方式解决问题。因此,很高兴接受所有帮助:) 我仍然对更好的方式感兴趣!

我还忘记了一些事情,例如将持有者的值切换回int(数字),这样我就会返回连接的数字对,而不是在实现它之后愚蠢地返回输入。

这是我的工作答案,最后! (我想以愚蠢,耗时的方式完成这项功能的满足感:D)

def thing(n):

    list1 = []
    list2 = []
    calc = False
    count = 0

    if n > 1 and n < 30:
        for x in range(1, n + 1):
            for y in range(1, n + 1):
                if (x * y) == n:
                    list1.append([x, y])
    else:
        print("Input invalid.")
        return

    for pair in list1:
        digits = str(pair[0]) + str(pair[1])
        holder = int(digits[count])
        while count < (len(digits) - 1):
            holder *= int(digits[count + 1])
            count += 1
        if holder == n:
            holder = int(digits)
            list2.append(holder)
            calc = True
        count = 0
    if calc:
        print(min(list2))
    else:
        print("No such number.")