/* Sum multiples of 3 and 5 in Picat. http://rosettacode.org/wiki/Sum_multiples_of_3_and_5 """ The objective is to write a function that finds the sum of all positive multiples of 3 or 5 below n. Show output for n = 1000. Extra credit: do this efficiently for n = 1e20 or higher. """ Note: This is the same task as Project Euler #1. For alternative versions see http://hakank.org/picat/euler1.pi (it includes 13 more or less different approaches) This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. % some simple versions go => println(sum([I: I in 1..999,(I mod 3 == 0; I mod 5==0)])), println(sum([I: I in 1..999,member(M,[3,5]), I mod M == 0])), println((3..3..999++5..5..999).remove_dups().sum()), nl. % test much larger numbers: 9, 99, ..., (10**140)-1 % (this takes 0.04s) go2 => Mults = [3,5], Limit = 99999999999999999999, println(sum_mult2(Limit,Mults)), foreach(I in 1..140) N = (10**I)-1, println(N=sum_mult2(N,Mults)) end, nl. go3 => println(sum([I: I in 1..10**20-1,(I mod 3 == 0; I mod 5==0)])), nl. % 2 elements in Mults sum_mult2(Limit,Mults) = sum([sum_mult1(Limit,Mult) : Mult in Mults]) - sum_mult1(Limit,prod(Mults)). sum_mult1(Limit,Mult) = Mult*((Limit div Mult)*(Limit div Mult+1) div 2).