C++で数値が3つの連続する整数の和として表現できるか判定する方法
本記事では、ある数値が「3つの連続する整数の和」として表現できるかどうかを判定する方法を解説します。例えば、27という数値は 8 + 9 + 10 のように、3つの連続する整数の合計として書き表すことができます。
問題を解く2つのアプローチ
この問題には、大きく分けて2つの解き方があります。
1. 単純なアプローチ(ナイーブ法)
最初の方法は最も直感的なものです。i + (i + 1) + (i + 2) を計算し、それが対象の数値と一致するかどうかを順番に確認していきます。ただし、この方法では候補を一つずつ調べる必要があるため、数値が大きい場合には非効率になります。
2. 効率的なアプローチ(3の倍数判定)
より効率的なのは、その数値が3で割り切れるかどうかを確認する方法です。
数学的に考えてみましょう。ある数 x が3つの連続する整数 (y − 1)、y、(y + 1) の和で表せるとすると、次の式が成り立ちます。
x = (y − 1) + y + (y + 1) = 3y
つまり、x は必ず3の倍数となります。したがって、「数値が3で割り切れるか」をチェックするだけで判定できるのです。
C++による実装例
#include <iostream>
using namespace std;
bool hasThreeNums(int n) {
if(n % 3 == 0){
return true;
}
return false;
}
int main() {
int num = 27;
if(hasThreeNums(num)){
cout << "Can be represented";
}else{
cout << "Cannot be presented";
}
}
出力結果
Can be represented
まとめ
3つの連続する整数の和は、必ず中央の値の3倍になります。そのため、判定条件は非常にシンプルで、剰余演算子 % を用いた「n % 3 == 0」のチェックだけで、O(1) の定数時間で回答を得ることができます。このように、数値の持つ性質を数学的に捉えることで、ナイーブな全探索よりもはるかに効率的なアルゴリズムを実装できるのがポイントです。
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ
-
Pythonで数値が「異なる階乗の和」として表せるかを判定するプログラム
問題の概要 正の整数 n が与えられたとき、n を互いに異なる階乗の値(1!, 2!, 3! など)の和として表すことができるかどうかを判定する問題です。 たとえば、入力が n = 144 の場合を考えてみましょう。 4! + 5! = 24 + 120 = 144 となるため、この場合の出力は True になります。 解法のアプローチ この問題は、次の手順で解くことができます。 fact を 1 で初期化し、結果を格納するための空のリスト res を用意します。また、カウンタ x を 2 とします。 fact <= n である限り、以下を繰り返して n 以下のすべての階乗をリストに