home
>
Project Euler
>
ForNext
Shut the fuck up and write some code
Problem 1
3か5の倍数になっている1000未満の自然数を足し合わせよ
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
参考:等差数列の和の公式
初項a、公差d の等差数列の 初項から第n項 (末項 l=a+(n−1)d) までの和Snは (項数n)
VBScript
更新日 : 2012.12.19
Option Explicit '単純に加算 Dim sum: sum = 0 Dim i For i = 1 To 999 If i Mod 3 = 0 Then sum = sum + i ElseIf i Mod 5 = 0 Then sum = sum + i End If Next WScript.Echo sum '等差数列の和 sum = 0 '初項, 公差 Dim a_list: a_list = Array(3, 5, 15) Dim a For Each a in a_list Dim n: n = 999 \ a '項数 Dim l: l = n * a '末項 a+(n−1)d Select Case a Case 3, 5: sum = sum + ((a + l) * n / 2) Case Else: sum = sum - ((a + l) * n / 2) End Select Next WScript.Echo sum
D:\Project Euler\001>cscript //nologo 001.vbs 233168 233168
JScript
更新日 : 2012.12.19
//単純に加算 var sum = 0; for (var i = 1; i < 1000; i++) { if ((i % 3) == 0) { sum += i; } else if ((i % 5) == 0) { sum += i; } } WScript.Echo(sum); //等差数列の和 sum = 0 var a_list = [3, 5, 15]; for (var i in a_list) { var a = a_list[i]; //初項, 公差 var n = parseInt(999 / a); //項数 var l = n * a; //末項 a+(n−1)d switch (i) { case "0": case "1": sum += ((a + l) * n / 2); break; default: sum -= ((a + l) * n / 2); break; } } WScript.Echo(sum);
D:\Project Euler\001>cscript //nologo 001.js 233168 233168
Perl
更新日 : 2012.12.19
use strict; use warnings; #単純に加算 my $sum = 0; for (1..999) { if (($_ % 3) == 0) { $sum += $_; } elsif (($_ % 5) == 0) { $sum += $_; } } print "$sum\n"; #等差数列の和 $sum = 0; #初項, 公差 foreach my $a (3, 5, 15) { my $n = int(999 / $a); #項数 my $l = $n * $a; #末項 a+(n−1)d if ($a == 3) { $sum += (($a + $l) * $n / 2); } elsif ($a == 5) { $sum += (($a + $l) * $n / 2); } elsif ($a == 15) { $sum -= (($a + $l) * $n / 2); } } print "$sum\n";
D:\Project Euler\001>perl 001.pl 233168 233168
PHP
更新日 : 2012.12.19
<?php #単純に加算 $sum = 0; foreach (range(1, 999) as $i) { if (($i % 3) == 0) $sum += $i; elseif (($i % 5) == 0) $sum += $i; } echo "$sum", "\n"; #等差数列の和 $sum = 0; #初項, 公差 foreach( array(3, 5, 15) as $a ) { $n = (int)(999 / $a); #項数 $l = $n * $a; #末項 a+(n−1)d switch ($a) { case 3: case 5: $sum += (($a + $l) * $n / 2); break; default: $sum -= (($a + $l) * $n / 2); break; } } echo "$sum", "\n"; ?>
D:\Project Euler\001>php 001.php 233168 233168
Python
更新日 : 2012.12.19
# coding: Shift_JIS #単純に加算 sum = 0 for i in range(1, 1000): if i % 3 == 0: sum += i elif i % 5 == 0: sum += i print sum #等差数列の和 sum = 0 #初項, 公差 for a in [3, 5, 15]: n = int(999 / a) #項数 l = n * a #末項 a+(n−1)d if a == 3 or a == 5: sum += ((a + l) * n / 2) else: sum -= ((a + l) * n / 2) print sum
D:\Project Euler\001>python 001.py 233168 233168
Ruby
更新日 : 2012.12.19
#単純に加算 sum = 0 (1..999).each do |i| if (i % 3) == 0 sum += i elsif (i % 5) == 0 sum += i end end puts sum #等差数列の和 sum = 0; #初項, 公差 [3, 5, 15].each do |a| n = 999 / a #項数 l = n * a; #末項 a+(n−1)d case a when 3, 5 sum += ((a + l) * n / 2) else sum -= ((a + l) * n / 2) end end puts sum
D:\Project Euler\001>ruby 001.rb 233168 233168
PowerShell
更新日 : 2012.12.19
#単純に加算 $sum = 0 foreach ($i in 1..999) { if (($i % 3) -eq 0) { $sum += $i } elseif (($i % 5) -eq 0) { $sum += $i } } Write-Host $sum #等差数列の和 $sum = 0 #初項, 公差 foreach($a in @(3, 5, 15)) { $n = [math]::floor(999 / $a) #項数 $l = $n * $a #末項 a+(n−1)d switch ($a) { 3 {$sum += (($a + $l) * $n / 2)} 5 {$sum += (($a + $l) * $n / 2)} default {$sum -= (($a + $l) * $n / 2)} } } Write-Host $sum
D:\Project Euler\001>powershell -file 001.ps1 233168 233168
Scala
更新日 : 2012.12.30
■単純に加算
scala> (1 to 9) res0: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> (1 to 9).filter(n => n % 3 == 0 || n % 5 == 0) res1: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 5, 6, 9) scala> (1 to 9).filter(n => n % 3 == 0 || n % 5 == 0).sum res2: Int = 23 scala> (1 to 999).filter(n => n % 3 == 0 || n % 5 == 0).sum res3: Int = 233168 scala>
■等差数列の和
scala> def sn(a:Int, lim:Int) = { | val n = lim / a | val l = n * a | (a + l) * n / 2 | } sn: (a: Int,lim: Int)Int scala> sn(3, 9) res4: Int = 18 scala> List(3, 5).map(sn(_, 999)).sum - sn(15, 999) res5: Int = 233168 scala>
scala> def multiples_of_3_and_5(n:Int) = { | if (n == 15) -sn(n, 999) | else sn(n, 999) | } multiples_of_3_and_5: (n: Int)Int scala> List(3, 5, 15).map(multiples_of_3_and_5).sum res6: Int = 233168 scala>
F#
更新日 : 2012.12.31
■単純に加算
> [1..9];; val it : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9] > [1..9] - |> List.filter (fun x -> x % 3 = 0 || x % 5 = 0) - ;; val it : int list = [3; 5; 6; 9] > [1..9] - |> List.filter (fun x -> x % 3 = 0 || x % 5 = 0) - |> List.sum - ;; val it : int = 23 > [1..999] - |> List.filter (fun x -> x % 3 = 0 || x % 5 = 0) - |> List.sum - ;; val it : int = 233168 >
■等差数列の和
> let sn a lim = - let n = lim / a in - let l = a * n in - (a + l) * n / 2 - ;; val sn : int -> int -> int > sn 3 9;; val it : int = 18 > [3;5] - |> List.map (fun n -> sn n 999) - |> List.sum - |> fun x -> x - sn 15 999 - ;; val it : int = 233168 >
> [3;5;15] - |> List.map (fun n -> if n = 15 then -(sn n 999) else sn n 999) - |> List.sum - ;; val it : int = 233168 >
> let multiples_of_3_and_5 n = - if n = 15 then -(sn n 999) - else sn n 999 - ;; val multiples_of_3_and_5 : int -> int > [3;5;15] - |> List.map (fun n -> multiples_of_3_and_5 n) - |> List.sum - ;; val it : int = 233168 > [3;5;15] - |> List.map multiples_of_3_and_5 - |> List.sum - ;; val it : int = 233168 >