C++で元の数でも割り切れる数字の並べ替えを実装する方法
整数型の数値(ここでは number と呼びます)が与えられます。この課題は、number の各桁を並べ替えて新しい数を作り、その並べ替え後の数が元の number でも割り切れるようにするというものです。
入出力シナリオの例
入力 − int number = 100035
出力 − 元の数で割り切れる並べ替え後の数値:300105
説明 − 整数 number として 100035 が与えられています。これらの桁を並べ替えて、元の数 100035 で割り切れる数を作る必要があります。桁を並べ替えた結果、100035 で割り切れる 300105 が得られました。
入力 − int number = 1000035
出力 − 元の数で割り切れる並べ替え後の数値:3000105
説明 − 整数 number として 1000035 が与えられています。同様に桁を並べ替え、1000035 で割り切れる数を探します。その結果、1000035 で割り切れる 3000105 が得られました。
入力 − int number = 28
出力 − 元の数で割り切れる並べ替え後の数値:-1
説明 − 整数 number として 28 が与えられています。桁を並べ替えると 82 になりますが、82 は 28 で割り切れません。条件を満たす並べ替えが存在しないため、出力は -1 となります。
プログラムで使用するアプローチ
整数型の変数(例:
number)を入力として受け取り、関数 Rearrangement(number) に渡します。関数 Rearrangement(number) の内部処理は以下の通りです。
整数型の要素を格納する vector 変数(例:
vec(10, 0))を作成します。関数 total_count(number, vec) を呼び出し、number と vec を引数として渡します。
i を 2 から 10 未満までループさせます。ループ内で temp を number * i に設定します。
別の vector 変数(例:
vec_2(10, 0))を作成します。関数 total_count(temp, vec_2) を呼び出し、temp と vec_2 を引数として渡します。
equal(vec.begin(), vec.end(), vec_2.begin()) が真であれば temp を返し、そうでなければ -1 を返します。
関数 total_count(int number, vector<int> &vec_3) の内部処理は以下の通りです。
number が 0 になるまで WHILE ループを回します。ループ内で vec_3[number % 10]++ として各桁の出現回数をカウントし、number を number / 10 で更新します。
このアルゴリズムのポイントは、元の数の各桁の出現回数と、number の倍数(2倍〜9倍)の各桁の出現回数を比較することです。両者の桁構成が完全に一致していれば、その倍数は「桁を並べ替えた数」として条件を満たします。
サンプルコード
#include<bits/stdc++.h>
using namespace std;
void total_count(int number, vector<int> &vec_3){
while(number){
vec_3[number % 10]++;
number = number / 10;
}
}
int Rearrangement(int number){
vector<int> vec(10, 0);
total_count(number, vec);
for(int i = 2; i < 10; i++){
int temp = number * i;
vector<int> vec_2(10, 0);
total_count(temp, vec_2);
if(equal(vec.begin(), vec.end(), vec_2.begin())){
return temp;
}
}
return -1;
}
int main(){
int number = 100035;
cout<<"Rearrangement of a number which is also divisible by it is: "<<Rearrangement(number);
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が生成されます。
Rearrangement of a number which is also divisible by it is: 300105
-
C++で巨大な数値が20で割り切れるかどうかを判定する方法
この記事では、非常に大きな数値が20で割り切れるかどうかを判定する方法を解説します。数値が int 型や long long 型の範囲を超えるほど大きい場合、通常の数値型では扱えないため、文字列として受け取る必要があります。判定の考え方ある数が20で割り切れるためには、「その数が10で割り切れ、かつ10で割った商が2で割り切れる」という条件を満たす必要があります。これをもっとシンプルに考えると、次の2つの条件に整理できます。条件1: 最後の桁(1の位)が「0」であれば、その数は10で割り切れる条件2: 下から2番目の桁(10の位)が偶数であれば、10で割った商も2で割り切れるつまり、末尾が「0
-
C++のCHAR_BITとは?意味と使い方を解説
CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ