views:

444

answers:

5
>>> sum((1, 2, 3, 4, 5, 6, 7))
28
>>> 28/7
4.0
>>> sum((1,2,3,4,5,6,7,8,9,10,11,12,13,14))
105
>>> 105/7
15.0
>>>

How do I automate this sum and division using a loop maybe?

Edit: Maybe I wasn't clear - I want a loop to keep doing the sum (of multiples of 7, eg 1-7, 1-14, 1-21 etc..) until it reaches x (x is the user input)

Okay, figured it out:

def sum_and_div_of_multiples_of_7(x):
  y = 7
  while (y <= x):
    mof7 = range(1,y)
    print ('mof7 is', mof7)

    total = sum(mof7)
    print ('total =', total)

    div = total/7
    print ('div =', int(div), '\n')

    y = y+7     # increase y

x = 70
sum_and_div_of_multiples_of_7(x)
+6  A: 

The direct answer:

def sum_to_number_divided_by_seven(i):
  return sum(range(i+1)) / 7

The more efficient answer:

def sum_to_number_divided_by_seven(i):
  return (i*(i+1))/14
BJ Homer
+1 for math knowledge!
Chris Lutz
Though after some testing, it appears that the second solution has some overflow issues. Passing 3800000, for example, produces different results between the two algorithms.
BJ Homer
Erm..maybe I wasn't clear: I want a loop to keep doing the sum (of multiples of 7, eg 1-7, 1-14, 1-21) unless it reaches x (x is the user input)
Nimbuz
@Nimbuz - No, that wasn't clear, because most humans can't extrapolate a pattern from two points. Usually 3 or so points of data are required before the relationship becomes clear.
Chris Lutz
but, sum(range(i)) sums the values (assuming i is 7 for example), 0 through 6, not 1 through 7 as i assume you would mean.. sum(range(1,8) on the other hand sums the values 1-7
Fifth-Edition
@BJ Using `range(i+1)` makes the result for 3800000 agree. It looks like `i` is supposed to be a multiple of 7 and we want the range to include `i`
gnibbler
Oh, very true. Thanks for fixing that!
BJ Homer
A: 

I'm not sure what you want, but maybe it is something like:

sum(range(x*7+1))/7
Kai
A: 

My version:

def sum_of_nums_divided_by_7(num):
    return reduce(lambda x, y: x+y, range(num)) / 7
aatifh
hasen j
I just tried to show a brief demo on how functional approach could be used. I agree that pythons in built function sum does that easily. :)
aatifh
@neo, it's better and clearer to use operator.add in place of the lambda function
gnibbler
A: 

if i understand your problem correctly. You want to be able to accept user input - x, and then sum values 1-7 then devide by 7, if the qoutient is higher than x stop there, otherwise continue to sum up 1-14, devide by 7 and check that quotient - and continute in multiples of 7?

My easy sollution is

x = input('user input - enter your value here')
y = 0
i = 1
while(x > y):
    q = sum(range(1, i*7+1))
    y = q/7
    print y
    i+=1

print "userinput:  %d" % (x)
print "iterations:  %d" %(i)
print "end value: %d" %(y)
Fifth-Edition
A: 
def sumdiv7(limit):
    for i in range(limit):
        result = sum(range(i*7)) / 7
        print "For", i, ", sumdiv = ", result

Example:

>>> sumdiv7(4)
For 0 , sumdiv =  0
For 1 , sumdiv =  3
For 2 , sumdiv =  13
For 3 , sumdiv =  30

The trick is very simple, you want to sum multiples of 7,

To get the ith multiple of 7, it's just i*7

range is a python function to get a list of numbers from 0 to x

sum sums a list.

Just put these pieces together

hasen j