Python - сумма чисел - PullRequest
       6

Python - сумма чисел

3 голосов
/ 13 августа 2010

Я пытаюсь суммировать все числа до диапазона со всеми числами до одного диапазона.

Я использую python:

limit = 10
sums = []
for x in range(1,limit+1):
    for y in range(1,limit+1):
        sums.append(x+y)

Это прекрасно работаетоднако из-за вложенных циклов, если лимит слишком велик, для вычисления сумм потребуется много времени.

Есть ли способ сделать это без вложенного цикла?

(Это просто упрощение того, что мне нужно сделать, чтобы решить задачу ProjectEuler. Это включает получение суммы всех чисел.)

Ответы [ 3 ]

2 голосов
/ 13 августа 2010
[x + y for x in xrange(limit + 1) for y in xrange(x + 1)]

Он по-прежнему выполняет столько же вычислений, но выполняет его примерно в два раза быстрее, чем цикл for.

from itertools import combinations

(a + b for a, b in combinations(xrange(n + 1, 2)))

Это позволяет избежать большого количества повторяющихся сумм.Я не знаю, хотите ли вы отследить их или нет.

Если вы просто хотите, чтобы каждая сумма без представления того, как вы ее получили, xrange(2*n + 2) дает вам то, что вы хотите, без дубликатов или цикловна все.

В ответ на вопрос:

 [x + y for x in set set1 for y in set2]
1 голос
/ 13 августа 2010

Я пытаюсь сложить все числа в диапазоне со всеми числами до тот же диапазон.

Итак, вы хотите вычислить limit**2 суммы.

из-за вложенных циклов, если предел слишком велик, это займет много время для расчета сумм.

Неверно: это не"из-за вложенных циклов" - это потому, что вы вычисляете квадратичное количество сумм и, следовательно, выполняете квадратичный объем работы.

Есть ли способ сделать это без вложенный цикл?

Вы можете замаскировать вложение, как в ответе @ aaron, и вы можете вдвое сократить количество вычисляемых сумм из-за симметрии задачи (хотя это не делает то же самое, что ваш код), но для подготовки список с квадратичным количеством элементов, абсолютно невозможно избежать выполнения квадратичного объема работы.

Однако, для вашей заявленной цели

получение суммы всего обильного число.

вам нужен бесконечный объем работы, поскольку существует бесконечное множество чисел; -).

Я думаю, что вы имеете в виду проблему 23, которая на самом деле сильно отличается: она запрашивает сумму всех чисел, которую не может быть выражена как сумма двух чисел с избытком. То, как суммирование, о котором вы спрашиваете, поможет вам приблизиться к этому решению, действительно ускользает от меня.

0 голосов
/ 13 августа 2010

Я не уверен, есть ли хороший способ не использовать вложенные циклы.

Если я надену вашу обувь, я напишу следующее:

[x + y дляx в диапазоне (1, предел + 1) для y в диапазоне (1, предел + 1)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...