2016-02-21 2 views
3

Написал программу python, которая добавила числа от 1 до заданного числа, используя уравнение Гаусса. Он работал на 100 и 10, но когда я делаю 3, он говорит, что сумма равна 4 вместо 6. Уравнение получается в моей голове, я испортил код?Функция Python для сумм целых чисел

def numberSum(num): 

    nim = int(num) 
    num = (nim/2)*(nim+1) 
    return num  

print numberSum(raw_input()) 
+3

Это, вероятно, является проблема целочисленного деления - попробуйте 'NIM/ – jonrsharpe

+2

Нет, не используйте 2.0. Умножьте перед делением. – interjay

ответ

4
from __future__ import division 

def number_sum(num): 
    """ 
    Return sum of 1 .. num 
    """ 
    return num * (num + 1) // 2 

num = int(raw_input(": ")) 
print(number_sum(num)) 

Что я изменил:

  • number_sum не должен нести ответственность за ввод типа литья; если он ожидает номер, вы должны указать его своего рода номера, а не строки.

  • , если num является int, то либо num или num + 1 даже, т.е. делением на 2 num * (num + 1) приведет к междунар. Это не обязательно соответствует num; поэтому вы должны разделить продукт на 2, а не num, если вы хотите получить целочисленный результат.

  • в Python 2.6+, from __future__ import division делает / всегда возвращают float результат и // всегда возвращают int результат, в соответствии с Python 3.x

+0

Я думаю, что этот ответ является наиболее правильным, так как сумма целых чисел также должна быть целочисленной, а не плавающей. И он также будет корректно работать в Python 3 – MaxU

3

Я полагаю, вы работаете с python2, потому что по умолчанию применяется целочисленное деление, как и другие языки. Кроме того, вы можете заметить эту функцию в этом сообщении Integer division in python 2 and python 3.

Чтобы решить проблему, вы можете следовать следующий подход:

def numberSum(num): 
    nim = int(num) 
    return ((nim * 1.0)/2) * (nim + 1)  

print numberSum(raw_input()) 
+0

Спасибо. Таким образом, умножая его на 1.0, можно разделить его на float? Я просто изменил порядок, как сказал jonrsharpe. – admiralmattbar

+0

@ user648: Это правильно. Целый раз поплавок приводит к поплавке. – zondo

+0

Да, будет. Как говорится здесь [python division] (http://stackoverflow.com/a/2958717/1689706), вы ожидаете другого поведения для 'python3'. –