【C++入門】大きな数値が37で割り切れるかどうかを判定するプログラムの作り方
はじめに
このチュートリアルでは、与えられた大きな数値が37で割り切れるかどうかを判定するC++プログラムを作成します。
判定には、少し数学的な性質を利用します。それでは、問題を解くための手順を順番に見ていきましょう。
- 判定対象となる数値を用意します。
- 桁数が3で割り切れない場合は、先頭に「0」を追加して桁数を3の倍数にします。
- 数値を3桁ずつのグループに分割し、各グループの値をすべて合計します。
- その合計が37で割り切れるならば、元の数値も37で割り切れます。
- 合計が4桁以上になった場合は、手順2以降を繰り返します。
- 最後に、元の数値が37で割り切れるかどうかを出力します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
bool isNumberDivisibleBy37(string number, int n) {
if (number == "0") {
return 0;
}
if (n % 3 == 1){
number = "00"+ number;
n += 2;
}
else if (n % 3 == 2){
number = "0"+ number;
n += 1;
}
int groups_sum = 0;
while (n != 0){
string group = number.substr(n - 3, n);
int group_value = (group[0] - '0') * 100 + (group[1] - '0') * 10 + (group[2] - '0') * 1;
groups_sum += group_value;
n = n - 3;
}
if (groups_sum >= 1000) {
string new_number = to_string(groups_sum);
return isNumberDivisibleBy37(new_number, new_number.length());
}
else {
return groups_sum % 37 == 0;
}
}
int main() {
string number = "4048675309";
if (isNumberDivisibleBy37(number, 10)) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
Yes
まとめ
このように、3桁ごとのグループ合計を繰り返し計算することで、非常に大きな数値でも効率的に37の倍数かどうかを判定できます。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で10進数を16進数に変換するプログラムの作り方
10進数の数値が入力として与えられたとき、その数値を16進数に変換するのが本記事の目的です。 コンピュータの世界では、16進数は基数16で表現され、10進数は基数10で表現されます。10進数は0〜9の値を使って表されるのに対し、16進数は0〜15の数字を持ちます。そのうち10は「A」、11は「B」、12は「C」、13は「D」、14は「E」、15は「F」として表されます。 10進数から16進数への変換手順 10進数を16進数に変換するには、以下の手順に従います。 まず、与えられた数値を変換先の基数で割ります。たとえば、6789を16進数に変換する場合、基数である16で6789を割り、商を求め
-
C++で10進数を2進数に変換するプログラムの書き方
コンピューターの内部では、すべてのデータが2進数(基数2)として扱われています。一方、私たちが日常的に使う10進数は「0〜9」の数字を組み合わせた基数10の記数法です。この記事では、C++を使って入力された10進数を2進数へ変換するプログラムの考え方と実装方法を解説します。10進数から2進数への変換手順10進数を2進数に変換する基本的な方法は、「2で割った余りを順番に記録していく」ものです。具体的には次の手順で行います。まず、変換したい数値を基数である2で割り、商と余りを求めます。余りが0であればその桁は「0」、1であれば「1」として記録します。続いて、得られた商をさらに2で割り、同じように余