「プロジェクトオイラー解説問1」の編集履歴(バックアップ)一覧はこちら

プロジェクトオイラー解説問1」(2014/01/07 (火) 08:37:24) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*Problem 1 「3と5の倍数」 † 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる. 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ. ---- 解法 この問題で解説が必要ということは、プログラム言語の基本構文であるループとif。 もしくは再帰処理などの記述がよくわからない。 という読者だと考えられます。 その辺を解説してみます。 ---- 解法1 **ループに頼らない数学的解法 高校数学の知識によればこの問題はプログラムを書くまでもなく一行でもとまります。 3の倍数は (3,6,9,,,,999) 5の倍数は (5,10,15,,,995) まであります。 3の倍数は (3*1,3*2,,,3*333)と記述しなおせます。 すると3の倍数の合計は 3(1+2+3+,,,+333)=3*(333*(334))/2 5の倍数の合計も同様で (5*1,5*2,,,5*199)より 5(1+2+,,,+199)=5*(199*200)/2 3と5の合計を単純に足し合わせると 15の倍数が重複して足されていますのでこれを引きます。 (15,30,,,,990)ですから(15*1,15*2,,,15*66)なので その計は 15*(1+2+,,,+66)=15*(66*67)/2 となります。 よって答えは 答え=3の倍数の計+5の倍数の計-15の倍数の計=3*(333*334)/2+5*(199*200)/2-15*(66*67)/2 となります ---- 解法2 ループに頼った解法。 言語によって違いますが基本は 整数型を1~999まで回してその数字が3か5で割り切れたら足しこんでいくだけです。 C系統の言語なら int ans=0; for(int i=1;i<1000;i++){ if(i%3==0 || i%5==0){ ans+=i; } } printf("%d",ans); と書けば答えが出力されます。 この文章はコードになっていて上から順に実行されます。 for(int i=1;i<1000;i++){,,,} でまずi=1と定義され。 次にi<1000がチェックされます。 大丈夫なら{,,,}の中身がi=1に設定されて実行されます。 次のifはもしもif()の中の条件式を満たせば{}の中身を実行する構文です。 i%3==0 はほかの言語では i mod 3が0と等しいかチェックする構文です。 || はまたわ とよみ orの意味があります。 if(i mod 3==0 || i mod 5==0){,,,} はi が3か5の倍数なら{}の中身を実行するという構文となります。 今回はiを答えに足しこむ操作です。 if分が終わりforの}に到達すると for(int i=1;i<1000;i++) にコードの実行が戻ります。 forによってコードの実行が上に戻り再度同じ範囲が実行されることをコードがループするといいます。 ループの2回目以降はまず最初に for(int i=1;i<1000;i++) のうちi++が実行されます。 i++はi=i+1という意味でi=2となります。 そして真ん中のi<1000がチェックされ、i<はまだ1000以下なのでfor(){,,,}の中身,,,が再度i=2になって実行されます。 そしてi=3,i=4とループし、i=1000となるとi<1000を超えたのでループが終了しfor分の末尾へと実行が移動しprintfで答えの出力が実行されるというわけです。 解説するとめんどくさい話ですが、体で覚えれば簡単な話です。 解説を読むよりも習うより慣れたほうがよいのでこの辺はコードをじっさいに書いて体で覚えるとよいでしょう。
*Problem 1 「3と5の倍数」 † 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる. 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ. ---- 解法 この問題で解説が必要ということは、プログラム言語の基本構文であるループとif。 もしくは再帰処理などの記述がよくわからない。 という読者だと考えられます。 その辺を解説してみます。 ---- 解法1 **ループに頼らない数学的解法 高校数学の知識によればこの問題はプログラムを書くまでもなく一行でもとまります。 3の倍数は (3,6,9,,,,999) 5の倍数は (5,10,15,,,995) まであります。 3の倍数は (3*1,3*2,,,3*333)と記述しなおせます。 すると3の倍数の合計は 3(1+2+3+,,,+333)=3*(333*(334))/2 5の倍数の合計も同様で (5*1,5*2,,,5*199)より 5(1+2+,,,+199)=5*(199*200)/2 3と5の合計を単純に足し合わせると 15の倍数が重複して足されていますのでこれを引きます。 (15,30,,,,990)ですから(15*1,15*2,,,15*66)なので その計は 15*(1+2+,,,+66)=15*(66*67)/2 となります。 よって答えは 答え=3の倍数の計+5の倍数の計-15の倍数の計=3*(333*334)/2+5*(199*200)/2-15*(66*67)/2 となります ---- 解法2 ループに頼った解法。 言語によって違いますが基本は 整数型を1~999まで回してその数字が3か5で割り切れたら足しこんでいくだけです。 C系統の言語なら int ans=0; for(int i=1;i<1000;i++){ if(i%3==0 || i%5==0){ ans+=i; } } printf("%d",ans); と書けば答えが出力されます。 この文章はコードになっていて上から順に実行されます。 for(int i=1;i<1000;i++){,,,} でまずi=1と定義され。 次にi<1000がチェックされます。 大丈夫なら{,,,}の中身がi=1に設定されて実行されます。 次のifはもしもif()の中の条件式を満たせば{}の中身を実行する構文です。 i%3==0 はほかの言語では i mod 3が0と等しいかチェックする構文です。 || はまたは とよみ orの意味があります。 if(i mod 3==0 || i mod 5==0){,,,} はi が3か5の倍数なら{}の中身を実行するという構文となります。 今回はiを答えに足しこむ操作です。 if分が終わりforの}に到達すると for(int i=1;i<1000;i++) にコードの実行が戻ります。 forによってコードの実行が上に戻り再度同じ範囲が実行されることをコードがループするといいます。 ループの2回目以降はまず最初に for(int i=1;i<1000;i++) のうちi++が実行されます。 i++はi=i+1という意味でi=2となります。 そして真ん中のi<1000がチェックされ、i<はまだ1000以下なのでfor(){,,,}の中身,,,が再度i=2になって実行されます。 そしてi=3,i=4とループし、i=1000となるとi<1000を超えたのでループが終了しfor分の末尾へと実行が移動しprintfで答えの出力が実行されるというわけです。 解説するとめんどくさい話ですが、体で覚えれば簡単な話です。 解説を読むよりも習うより慣れたほうがよいのでこの辺はコードをじっさいに書いて体で覚えるとよいでしょう。

表示オプション

横に並べて表示:
変化行の前後のみ表示: