C++で数値を除算した際の小数点以下の桁数を数える方法
2つの整数 num1 と num2 が与えられたとき、num1 を num2 で除算し、その結果の小数点以下の桁数を求めるのが本記事のテーマです。
具体例
入力 − num1 = 2, num2 = 5
出力 − count is 1
説明 − 2 を 5 で割ると 2/5 = 0.4 となり、小数点以下の桁数は 1 桁であるため、count は 1 になります。
入力 − num1 = 2, num2 = 0
出力 − Floating point exception (core dumped)
説明 − 任意の数を 0 で割るとエラーが発生し、プログラムは異常終了します。実装の際はゼロ除算への対処が必要です。
入力 − num1 = 2, num2 = 3
出力 − Infinite
説明 − 2 を 3 で割ると 2/3 = 0.666... となり、小数点以下の桁数は無限に続きます。このような循環小数の場合は infinite を出力します。
プログラムで使用するアプローチ
2つの変数 num1 と num2 を入力として受け取ります
小数点以下の桁数を格納する変数 count を作成し、0 で初期化します
unordered_map 型の変数 mymap を作成します
num1 % num2 != 0 が成立する間、ループを継続します
ループ内では、num1 に num1 % num2 の値(余り)を設定します
count の値を 1 ずつ増加させます
mymap.find(num1) != mymap.end() が成立する場合、同じ余りが再登場したことを意味するため、-1 を返します(循環小数の検出)
ループを抜けたら、count の値を返します
最後に結果を出力します
サンプルコード
#include <iostream>
#include <unordered_map>
using namespace std;
int countdigits(int x, int y){
int result = 0; // 結果を格納する変数
unordered_map<int, int> mymap;
// 余りを計算
while (x % y != 0){
x = x % y;
result++;
if (mymap.find(x) != mymap.end()){
return -1;
}
mymap[x] = 1;
x = x * 10;
}
return result;
}
int main(){
int res = countdigits(2, 5);
(res == -1)? cout << "count is Infinity" : cout << "count is " << res;
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます −
count is 1
このアルゴリズムのポイントは、unordered_map を使って出現済みの余りを記録することです。同じ余りが 2 回現れた時点で小数の桁が無限に続く循環小数と判定できるため、無限ループを回避しながら効率的に桁数を求められます。
-
【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装
縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L
-
C++でAにN桁を追加し、毎回の追加後にBで割り切れる数を生成する方法
問題の概要 本記事では、数値AにN桁を追加して新しい数値を作成する方法を解説します。ただし、各段階で桁を追加した直後に、その数値が別の数値Bで割り切れるという条件を満たす必要があります。 具体例として、「8」から始まる5桁の数を作り、4桁を追加しながら7での割り切りを確認するケースを考えてみましょう。最初に8に4を付け足すと「84」となり、これは7で割り切れます。その後は0を追加しても「840」「8400」「84000」と、いずれも7で割り切れたままです。もし条件を満たす数値が生成できない場合は、-1を返します。 アルゴリズムの考え方 基本的な戦略はシンプルです。各ステップで0から9までの数