C++で10のK乗(10^K)で割り切れる数にするための最小削除桁数
問題文
正の整数 N と K が与えられます。N の桁をいくつか削除して、残った数が 10K(10のK乗)で割り切れるようにしたいとき、削除が必要となる最小の桁数を求めてください。どのように削除しても条件を満たせない場合は -1 を出力します。
例
N = 10203027、K = 2 の場合を考えてみましょう。このとき必要な削除桁数は 3 桁です。「3」「2」「7」の 3 桁を取り除くと、数は 10200 となり、これは 102 = 100 で割り切れます。
アルゴリズム
まず押さえておきたいのは、「ある整数が 10K で割り切れる ⟺ その数の末尾に 0 が K 個以上並んでいる」という性質です。したがって、数を一の位から順に走査し、0 以外の桁はすべて削除候補としてカウントし、0 を K 個見つけた時点で走査を打ち切るのが最適な戦略となります。
1. 数を末尾(一の位)から先頭へ向かって走査する。現在の桁が 0 でなければカウンターを +1、0 であれば変数 K を -1 する
2. 走査中に K が 0 になったら、その時点のカウンターの値を答えとして返す
3. 最後まで走査しても K が 0 にならない場合、0 が 1 つでも見つかっていれば「N の桁数 − 1」を答えとして返す
4. 数の中に 0 が 1 つも含まれていない場合は -1 を返す
C++ 実装例
#include <bits/stdc++.h>
using namespace std;
int getBitsToBeRemoved(int n, int k) {
string s = to_string(n);
int result = 0;
int zeroFound = 0;
for (int i = s.size() - 1; i >= 0; --i) {
if (k == 0) {
return result;
}
if (s[i] == '0') {
zeroFound = 1;
--k;
} else {
++result;
}
}
if (!k) {
return result;
} else if (zeroFound) {
return s.size() - 1;
}
return -1;
}
int main() {
int n = 10203027;
int k = 2;
cout << "Minimum required removals = " <<
getBitsToBeRemoved(n, k) << endl;
return 0;
}
上記のプログラムをコンパイルして実行すると、次のような出力が得られます。
出力
Minimum required removals = 3
コードのポイント
- to_string による文字列化: 整数 n を文字列に変換することで、各桁に簡単にアクセスできるようになります。
- 末尾からの走査: 一の位から順に確認することで、「末尾に K 個の 0 を残す」という条件を効率的に判定できます。
- 計算量: 数値の桁数を d とすると、時間計算量は O(d)、空間計算量も O(d)(文字列保持分)にとどまります。
- エッジケース: 0 が 1 つも含まれていない数(例:12345)に対しては、どのように削除しても 10K の倍数を作れないため、-1 を返します。
-
C++で巨大な数値が20で割り切れるかどうかを判定する方法
この記事では、非常に大きな数値が20で割り切れるかどうかを判定する方法を解説します。数値が int 型や long long 型の範囲を超えるほど大きい場合、通常の数値型では扱えないため、文字列として受け取る必要があります。判定の考え方ある数が20で割り切れるためには、「その数が10で割り切れ、かつ10で割った商が2で割り切れる」という条件を満たす必要があります。これをもっとシンプルに考えると、次の2つの条件に整理できます。条件1: 最後の桁(1の位)が「0」であれば、その数は10で割り切れる条件2: 下から2番目の桁(10の位)が偶数であれば、10で割った商も2で割り切れるつまり、末尾が「0
-
C++で数値の累乗を計算する方法:再帰・非再帰プログラムの実装例
数の累乗とは数の累乗は x^y の形式で表され、x は基数(底)、y は指数を表します。例を見てみましょう。x = 2、y = 10 の場合 x^y = 1024 ここで、x^y は 2^10 を意味します数の累乗は、再帰的プログラムと非再帰的プログラムの2つの方法で計算できます。以下、それぞれの実装方法を詳しく解説します。非再帰プログラムによる累乗の計算まずは、forループを使用した非再帰的なプログラムの例です。サンプルコード#include<iostream>using namespace std;int power(int x, int y) { int i