程序用于计算从0到999的所有数字的总和,产生一致的结果

时间:2011-06-07 17:54:16

标签: python math

下面是python代码,它尝试使用找到的算术级数方程式here找到所有值之和除以特定数字

程序只会在少数时间内产生不正确的输出,每次都会以相同的数量关闭相同的数字。

示例输出 格式:首先是我们试图找到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中并运行。在这一点上,要么是这些问题 由一个带有derp(微不足道的错误)的一个herp引起的或者对该语言的一些误解。在此先感谢您的任何帮助

  

“”“SumDivisibleby返回a的总和   可分割的一系列数字   通过参数的值

     

参数:   first - 一个指定第一个值的整数   其常数差异的算术系列   等于第一个值

     

last - 一个指定最后一个值的整数   其常数差异的算术系列   等于第一个值

     

nTerms - 一个整数,指定术语数   在常数差异的算术系列中   等于第一个值“”“

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

  

“”“nthTerm找到一个单词   在算术系列中   常数差异等于   第一个值

     

参数:   first - 一个指定第一个值的整数   其常数差异的算术系列   等于第一个值

     

nTerms - 一个整数,指定术语数   在常数差异的算术系列中   等于第一个值

     

cDiff - 表示常数差异的整数   一个算术系列,如果它确实不同   从第一个值“”“

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

“””   determineN找到的数量   术语特定的算术系列   会有

     

first - 一个指定的整数   常数差的算术级数的第一个值       等于第一个值

     

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 个答案:

答案 0 :(得分:3)

您遇到了整数除法和操作顺序的问题。删除括号以更改您的功能:

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个项的序列增加5s)。这等于50,应该由SumDivisibleBy(5,20,4)给出。但是你的版本给出了48。