Программа, используемая для вычисления суммы всех чисел от нуля до 999 с получением последовательных результатов - PullRequest
1 голос
/ 07 июня 2011

Ниже приведен код Python, который пытается найти сумму всех значений, деленную на определенное число, с использованием найденных уравнений арифметической прогрессии здесь

Программа выдаст неправильный вывод только несколько раз, при этом одни и те же числа будут отключаться на одну и ту же величину каждый раз.

Пример вывода Формат: сначала это число, которое мы пытаемся найти суммой всех чисел в диапазоне 0-999, которое делится на него. Далее следует грубый ответ, моя попытка и, наконец, разница между двумя ответами

ОШИБКА: 7) correctAnswer = 71071! = TestAnswer = 71000 correctAnswer-testAnswer = 71

ОШИБКА: 11) correctAnswer = 45045! = TestAnswer = 45000 correctAnswer-testAnswer = 45

ОШИБКА: 13) correctAnswer = 38038! = TestAnswer = 38000 correctAnswer-testAnswer = 38

ОШИБКА: 15) correctAnswer = 33165! = TestAnswer = 33132 correctAnswer-testAnswer = 33

ОШИБКА: 17) correctAnswer = 29087! = TestAnswer = 29058 correctAnswer-testAnswer = 29

ОШИБКА: 19) correctAnswer = 26182! = TestAnswer = 26156 correctAnswer-testAnswer = 26

ОШИБКА: 29) correctAnswer = 17255! = TestAnswer = 17238 correctAnswer-testAnswer = 17

ОШИБКА: 31) correctAnswer = 16368! = TestAnswer = 16352 correctAnswer-testAnswer = 16

ОШИБКА: 33) correctAnswer = 15345! = TestAnswer = 15330 correctAnswer-testAnswer = 15

ОШИБКА: 35) correctAnswer = 14210! = TestAnswer = 14196 correctAnswer-testAnswer = 14

ОШИБКА: 41) correctAnswer = 12300! = TestAnswer = 12288 correctAnswer-testAnswer = 12

ОШИБКА: 45) correctAnswer = 11385! = TestAnswer = 11374 correctAnswer-testAnswer = 11

ОШИБКА: 49) correctAnswer = 10290! = TestAnswer = 10280 correctAnswer-testAnswer = 10

ОШИБКА: 53) correctAnswer = 9063! = TestAnswer = 9054 correctAnswer-testAnswer = 9

ОШИБКА: 55) correctAnswer = 9405! = TestAnswer = 9396 correctAnswer-testAnswer = 9

...

Список можно продолжить, но обратите внимание, как разница между двумя ответами уменьшается. Ошибка в конечном итоге падает на 499, другими словами, после 499 программа работает отлично

Код после этого абзаца, он полностью документирован и должен быть готов просто скопировать вставку в IDE и запустить. На данный момент, либо эти проблемы вызвано герпесом со стороной сумасшедшего (тривиальная ошибка) или некоторым недоразумением о языке. Заранее благодарим за любую помощь

"" "SumDivisibleby возвращает сумму серия чисел, которые делятся по значению параметра сначала

Параметры: first - целое число, которое определяет первое значение арифметического ряда с постоянной разностью равно первому значению

last - целое число, которое указывает последнее значение арифметического ряда с постоянной разностью равно первому значению

nTerms - целое число, которое указывает количество терминов в арифметическом ряду, чья постоянная разница равно первому значению "" "

def SumDivisibleby (первый, последний, nTerms): вернуть nTerms * ((первый + последний) / 2);

"" "nthTerm находит один термин в арифметическом ряду которого постоянная разница равна первое значение

Параметры: first - целое число, которое определяет первое значение арифметического ряда с постоянной разностью равно первому значению

nTerms - целое число, которое указывает количество терминов в арифметическом ряду, чья постоянная разница равно первому значению

cDiff - целое число, представляющее постоянную разницу арифметической серии, здесь, если она действительно отличается от первого значения "" "

def nthTerm(first,nTerms,cDiff):
    return first + ((nTerms - 1)*cDiff)

"" "defineN находит число терминов, которое будет иметь конкретный арифметический ряд

first - целое число, которое указывает первое значение арифметического ряда, постоянная разность которого равна первымvalue

max - целое число, которое задает максимально возможное значение, допустимое в арифметическом ряду.

cDiff - целое число, которое представляет собой постоянную разницу арифметического ряда, здесь, если оно действительно отличается от первогозначение "" "

def determineN (first, max, cDiff):
    return ((max - first)/cDiff)+1

" "" testSumDivisibleBy - это тестовый драйвер для трех вышеуказанных функций "" "

#This value is the chosen upper bound 
#for the arithmetic series
chosenMax = 999 

def testSumDivisibleBy ():
    for i in range(1,2000000):

        #Attempting to find the sum of all values divisible by i

        numberOfTerms = determineN(i, chosenMax , i)
        lastTerm = nthTerm(i, numberOfTerms, i)
        testAnswer = SumDivisibleby(i,lastTerm,numberOfTerms)

        #This is a brute force solution to the same problem
        #that SumDivisibleBy() tries to solve

        correctAnswer = 0
        for j in range(0,chosenMax +1,i):
            correctAnswer+=j

        #This prompts the user when a discrepancy has come 
        #up and displays debug text 

        if(testAnswer != correctAnswer):
            print "ERROR: " + repr(i) + ") correctAnswer = " + \
            repr(correctAnswer) + " != testAnswer = " + \
            repr(testAnswer) + " correctAnswer-testAnswer = " + \
            repr(correctAnswer-testAnswer)
    return

#Function call
testSumDivisibleBy()

1 Ответ

3 голосов
/ 07 июня 2011

Вы столкнулись с проблемой целочисленного деления и порядка операций. Снимите скобки, чтобы изменить свою функцию из этого:

def SumDivisibleby(first,last,nTerms): return nTerms * ((first + last)/2);

к этому:

def SumDivisibleby(first,last,nTerms): return nTerms * (first + last)/2;

РЕДАКТИРОВАТЬ: В качестве примера того, где это проблема, рассмотрим вычисление суммы 5 + 10 + 15 + 20 (4-членная последовательность увеличивается на 5 с). Это равно 50, и должно быть задано SumDivisibleBy (5, 20, 4). Но твоя версия дает 48.

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