数学の力

京大生が数学の定理・公式の証明や入試問題の解説をするブログ.

プロジェクトオイラー1. ~ Multiples of 3 and 5 ~


スポンサードリンク

No.1 Multiples of 3 and 5

問題.

Q. 10 未満で, 3 または 5 の倍数は 3, 5, 6, 9 の 4 つで, それらの総和は 23 となる.

では, 1,000 未満で 3 または 5 の倍数であるものの総和はいくらか.

 

考え方とプログラム例(c++/Python3)

1. シンプルにループで和を求める

1,000 未満とあまり大きな数ではないので, 1~999 のすべての数について 3 or 5 の倍数かどうかを調べて足しあげていきます.

#include<bits/stdc++.h>
using namespace std;
int main(){
    int ans = 0;
    for(int i = 1; i < 1000; i++){
        if(i % 3 == 0 || i % 5 == 0)
            ans += i;
    }
    cout << ans << endl;
    return 0;
}

 

pythonを使えば1行で書くこともできます.

print(sum([n for n in range(1, 1000) if n % 3 == 0 or n % 5 == 0]))

2. 1からの自然数の和の公式を用いる

3 または 5 の倍数の総和は,

(3 の倍数の総和) + (5 の倍数の総和) - (15 の倍数の総和)

で求まります.

 

例えば, 3 の倍数は  3, 6, \ldots, 999 の333個で, その和は, 公式を使って,

\begin{align*}
3+6+\ldots+999 &=  3(1+2+\ldots+333)\\
&=  3\cdot \dfrac{1}{2}\cdot 333\cdot (333+1)\\
&=  166833
\end{align*}

のように求められます.

#include<bits/stdc++.h>
using namespace std;
int Sum(int a, int n){
	int m = (n-1) / a;
	return (a * m * (m+1) / 2);
}
int main(){
    int ans = Sum(3, 1000) + Sum(5, 1000) - Sum(15, 1000);
    cout << ans << endl;
    return 0;
}