包除原理を使うのはやめて、本来の書き方ではないのですがループを使いましょう。
while
$n = 1000 $s = 0 $k = 1 while($k -lt $n) { if($k % 3 -eq 0 -or $k % 5 -eq 0) { $s += $k } $k += 1 } $s
whileはCとだいたい同じです。ただ、比較演算子が違います。>がリダイレクトに使われていたりするからですね。詳しくは、
for
$n = 1000 $s = 0 for($k = 1; $k -lt $n; ++$k) { if($k % 3 -eq 0 -or $k % 5 -eq 0) { $s += $k } } $s
forもほとんどCと同じです。インクリメントやデクリメントもあります。
foreach
オブジェクトの列を一つずつ処理します。
$n = 1000 $s = 0 foreach($k in 1..($n-1)) { if($k % 3 -eq 0 -or $k % 5 -eq 0) { $s += $k } } $s
この場合、オブジェクトの列というのは、
1..($n-1)
ですね。これはPython2のxrangeに似ています。すなわち、実際に1から999までの整数が用意するわけではありません。なぜなら、
$n = 10000000 $s = 0 foreach($k in 1..($n-1)) { ...
これでもメモリを食うわけではないからです。しかし、ひとたび変数で受けると配列になってしまうようです。
$n = 10000000 $a = 1..($n-1)
たった1000万要素でも400MBくらい食っているようです。非常に怖いので注意しましょう。