Sum multiples of 3 and 5: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|REXX}}: changed to below :-) thanks)
(→‎{{header|Perl 6}}: Add Python. (three ways).)
Line 28: Line 28:
{{out}}
{{out}}
<pre>233168</pre>
<pre>233168</pre>

=={{header|Python}}==
Three ways of performing the calculation are shown including direct calculation of the value without having to do explicit sums in sum35c()
<lang python>def sum35a(n):
'Direct count'
# note: ranges go to n-1
return sum(x for x in range(n) if x%3==0 or x%5==0)

def sum35b(n):
"Count all the 3's; all the 5's; minus double-counted 3*5's"
# note: ranges go to n-1
return sum(range(3, n, 3)) + sum(range(5, n, 5)) - sum(range(15, n, 15))
def sum35c(n):
'Sum the arithmetic progressions: sum3 + sum5 - sum15'
consts = (3, 5, 15)
# Note: stop at n-1
divs = [(n-1) // c for c in consts]
sums = [d*c*(1+d)/2 for d,c in zip(divs, consts)]
return sum(sums[:-1]) - sums[-1]

#test
for n in range(1001):
sa, sb, sc = sum35a(n), sum35b(n), sum35c(n)
assert sa == sb and sa == sc
print('For n = %i -> %i' % (n, sc))</lang>

{{out}}
<pre>For n = 1000 -> 233168</pre>


=={{header|REXX}}==
=={{header|REXX}}==

Revision as of 17:11, 14 May 2013

Sum multiples of 3 and 5 is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

The objective is to find the sum of multiplies of 3 or 5 below n within a function. Test it with n = 1000.

BASIC

Works with: FreeBASIC
This example is incorrect. Please fix the code and remove this message.

Details: (Or if the function is right, then the task description should say 'count of positive multiples of 3 or 5 no greater than a given number.' or some such...see discussion tab above.)


I'd suggest to change s += 1 to s += i
REXX also finds 467 numbers <lang basic>Declare function mulsum35(n as integer) as integer Function mulsum35(n as integer) as integer

   Dim s as integer
   For i as integer = 1 to n
       If (i mod 3 = 0) or (i mod 5 = 0) then
           s += 1
       End if
   Next i
   Return s

End Function Print mulsum35(1000) Sleep End</lang>

Output:
 46

Perl 6

<lang perl6>sub sum35($n) { [+] grep * %% (3|5), ^$n; }

say sum35 1000;</lang>

Output:
233168

Python

Three ways of performing the calculation are shown including direct calculation of the value without having to do explicit sums in sum35c() <lang python>def sum35a(n):

   'Direct count'
   # note: ranges go to n-1
   return sum(x for x in range(n) if x%3==0 or x%5==0)

def sum35b(n):

   "Count all the 3's; all the 5's; minus double-counted 3*5's"
   # note: ranges go to n-1
   return sum(range(3, n, 3)) + sum(range(5, n, 5)) - sum(range(15, n, 15))
   

def sum35c(n):

   'Sum the arithmetic progressions: sum3 + sum5 - sum15'
   consts = (3, 5, 15)
   # Note: stop at n-1
   divs = [(n-1) // c for c in consts]
   sums = [d*c*(1+d)/2 for d,c in zip(divs, consts)]
   return sum(sums[:-1]) - sums[-1]
  1. test

for n in range(1001):

   sa, sb, sc = sum35a(n), sum35b(n), sum35c(n)
   assert sa == sb and sa == sc
   

print('For n = %i -> %i' % (n, sc))</lang>

Output:
For n = 1000 -> 233168

REXX

<lang rexx>/* REXX ***************************************************************

  • 14.05.2013 Walter Pachl
                                                                                                                                            • /

Say mul35() exit mul35: s=0 Do i=1 To 999

 If i//3=0 | i//5=0 Then
   s=s+i
 End

Return s</lang> Output:

233168