Windows PowerShellでProject Euler(4) ループ

Problem 1

包除原理を使うのはやめて、本来の書き方ではないのですがループを使いましょう。

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とだいたい同じです。ただ、比較演算子が違います。>がリダイレクトに使われていたりするからですね。詳しくは、

about_comparison_operators

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くらい食っているようです。非常に怖いので注意しましょう。