用于计算从零到999的所有数字之和的一致结果程序

1 投票
1 回答
1112 浏览
提问于 2025-04-16 19:07

下面是一个Python代码,它试图通过算术级数的公式来找出所有能被特定数字整除的值的总和。你可以在这里找到相关的算术级数的知识。

这个程序偶尔会输出错误的结果,而且每次出错的数字都是相同的。

示例输出格式:首先是我们尝试找出0到999之间所有能被这个数字整除的数字的总和。接下来是通过暴力计算得到的答案,然后是我的尝试结果,最后是这两个答案之间的差异。

错误:7) 正确答案 = 71071 != 测试答案 = 71000 正确答案-测试答案 = 71

错误:11) 正确答案 = 45045 != 测试答案 = 45000 正确答案-测试答案 = 45

错误:13) 正确答案 = 38038 != 测试答案 = 38000 正确答案-测试答案 = 38

错误:15) 正确答案 = 33165 != 测试答案 = 33132 正确答案-测试答案 = 33

错误:17) 正确答案 = 29087 != 测试答案 = 29058 正确答案-测试答案 = 29

错误:19) 正确答案 = 26182 != 测试答案 = 26156 正确答案-测试答案 = 26

错误:29) 正确答案 = 17255 != 测试答案 = 17238 正确答案-测试答案 = 17

错误:31) 正确答案 = 16368 != 测试答案 = 16352 正确答案-测试答案 = 16

错误:33) 正确答案 = 15345 != 测试答案 = 15330 正确答案-测试答案 = 15

错误:35) 正确答案 = 14210 != 测试答案 = 14196 正确答案-测试答案 = 14

错误:41) 正确答案 = 12300 != 测试答案 = 12288 正确答案-测试答案 = 12

错误:45) 正确答案 = 11385 != 测试答案 = 11374 正确答案-测试答案 = 11

错误:49) 正确答案 = 10290 != 测试答案 = 10280 正确答案-测试答案 = 10

错误:53) 正确答案 = 9063 != 测试答案 = 9054 正确答案-测试答案 = 9

错误:55) 正确答案 = 9405 != 测试答案 = 9396 正确答案-测试答案 = 9

...

这个列表还在继续,但注意到两个答案之间的差异在逐渐减小。错误在499之后就消失了,也就是说,499之后程序就能完美运行了。

代码在这段话之后,已经有详细的注释,可以直接复制粘贴到IDE中运行。此时,这些问题可能是因为一些小错误或者对语言的误解。感谢大家的帮助!

""" SumDivisibleby 函数返回一个 能被参数值整除的数字系列的总和 """

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

last - 一个整数,指定算术级数的最后一个值, 这个级数的常数差等于first的值

nTerms - 一个整数,指定算术级数中的项数, 这个级数的常数差等于first的值 """

def SumDivisibleby(first,last,nTerms):

    return nTerms * ((first + last)/2);

""" nthTerm 函数找到 算术级数中的一个项, 这个级数的常数差等于first的值 """

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

nTerms - 一个整数,指定算术级数中的项数, 这个级数的常数差等于first的值

cDiff - 一个整数,表示算术级数的常数差, 这里是为了防止与first的值不同 """

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

""" determineN 函数找出一个特定算术级数的项数 """

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

max - 一个整数,指定算术级数中允许的最大值

cDiff - 一个整数,表示算术级数的常数差, 这里是为了防止与first的值不同 """

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

你遇到了整数除法和运算顺序的问题。把括号去掉,可以把你的函数从这样:

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

改成这样:

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

补充说明:举个例子,假设你要计算5+10+15+20的和(这是一个每次增加5的四项序列)。这个和是50,应该通过SumDivisibleBy(5, 20, 4)来得到。但是你现在的版本却得到了48。

撰写回答