【C++】配列の全要素の数字を使って3で割り切れる数を作成できるか判定する方法
問題概要
この問題では、整数型の配列が与えられます。配列の各要素を構成するすべての数字を組み合わせて1つの数を作り、その数が3で割り切れるかどうかを判定します。割り切れる場合は “Yes” を、そうでない場合は “No” を出力してください。
入出力例
具体例を見ながら問題を理解しましょう。
入力 − arr = {3, 5, 91}
出力 − YES
説明 − 配列の数字を組み合わせると、たとえば 5193 という数が作れます。5193 は 3 で割り切れるため、答えは YES となります。
解法のポイント:3の倍数の判定規則
この問題を効率よく解くカギとなるのが、次の3の倍数の判定規則です。
ある数の各桁の数字の合計が3で割り切れるならば、その数は必ず3で割り切れる。
つまり、実際に大きな数を組み立てる必要はありません。配列の全要素の合計値を求め、それが3で割り切れるかどうかを確認するだけで判定できます。これは、各要素の「桁の合計」を3で割った余りは、その要素自身を3で割った余りと等しくなるためです。
アルゴリズムの手順
- 変数 rem を0で初期化し、配列の各要素について「(rem + 要素) % 3」を繰り返し計算して余りを更新していきます。
- 最終的に rem が 0 であれば、作成可能な数は3で割り切れるので YES を返します。
- rem が 0 以外の場合は NO を返します。
実装例
以下は、上記の解法を実装したC++プログラムです。
#include <iostream>
using namespace std;
bool is3DivisibleArray(int arr[], int n) {
int rem = 0;
for (int i = 0; i < n; i++)
rem = (rem + arr[i]) % 3;
return (rem == 0);
}
int main(){
int arr[] = { 23, 64, 87, 12, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "配列の数字から作成できる数は";
is3DivisibleArray(arr, n) ? cout << "3で割り切れます"
: cout << "3で割り切れません";
return 0;
}実行結果
配列の数字から作成できる数は3で割り切れます
計算量
- 時間計算量: O(n) — 配列の要素を一度だけ走査します。
- 空間計算量: O(1) — 余りを保持する変数1つだけで済みます。
まとめ
この問題は、「ある数が3で割り切れる ⇔ 各桁の合計が3で割り切れる」という性質を利用することで、数を実際に構築せずに配列の合計の余りを計算するだけで解けます。非常にシンプルで高速な線形時間アルゴリズムとして実装できるのがポイントです。
-
配列内のすべての数字を使って3の倍数を作れるか判定するJavaプログラム
配列内のすべての数字(桁)を使用して、3で割り切れる数を作ることができるかどうかを判定する方法は、実は非常にシンプルです。その鍵となるのが「3の倍数の性質」です。各要素を3で割った余りの合計が0になれば、それらの数字を組み合わせて3の倍数を作れることになります。以下にJavaのコード例を示します。 サンプルコード import java.io.*; import java.util.*; public class Demo{ public static boolean division_possible(int my_arr[], int n_val){
-
【Python】配列内のすべての桁を使って3で割り切れる数を作成できるか判定する方法
この記事では、与えられた問題文を解決するための解法とアプローチについて詳しく解説します。 問題文 整数の配列が入力として与えられたとき、これらの数値に含まれるすべての桁を使用して、3で割り切れる整数を作成できるかどうかを判定する必要があります。 ここでは、整数の配列と配列の長さという2つの引数を受け取る関数を作成します。 解法のポイント この実装は、暗算でよく使われる数学的な性質に基づいています。それは次の通りです。 「ある数の各桁の合計が3で割り切れるならば、その数自体も3で割り切れる」 この性質を利用すると、実際に桁を組み合わせて数値を生成する必要はなく、配列内の各要素について3で割った余