C/C++プログラムで桁の配列として表現された数値に1を加算する方法
この記事では、少し変わった興味深い問題を取り上げます。ある数値が与えられ、それに1を加算する——これは一見すると非常に簡単なタスクです。しかし、ここでは数値を配列として扱います。つまり、数値の各桁が配列の要素として格納されます。例えば、数値が512であれば、{5, 1, 2}のように保存されます。さらに、この加算処理は再帰的なアプローチを用いて実装します。まずは全体の流れをつかむために、アルゴリズムを見ていきましょう。
アルゴリズム
increment(arr, n, index) −
初期状態では index のデフォルト値は 0
begin
if index < n, then
if arr[index] < 9, then
arr[index] := arr[index] + 1
else
arr[index] := 0
increment(arr, n, index + 1)
end if
if index = n, then
arr[n] := 1
n := n + 1
end if
endこのアルゴリズムのポイントは以下の3点です。
- 現在の桁(index の位置)が9未満であれば、その桁に1を足すだけで処理は完了します。
- 現在の桁が9である場合、繰り上がりが発生します。その桁を0にして、次の桁に対して再帰的に同じ関数を呼び出します。
- すべての桁が9だった場合(例:999 → 1000)、最上位に新たな桁として1を追加し、桁数 n を1つ増やします。
実装例
#include <iostream>
#include <cmath>
#define MAX 20
using namespace std;
void increment(int num_arr[], int &n, int index = 0){
if(index < n){
if(num_arr[index] < 9){ // 桁が9未満なら1を加算
num_arr[index]++;
}else{ // そうでなければ再帰的に繰り上がり処理
num_arr[index] = 0;
increment(num_arr, n, index+1);
}
}
if(index == n){
num_arr[n] = 1; // 最上位に繰り上がりの1を追加
n++; // 桁数を1増やす
}
}
void dispNumber(int num_arr[], int n){
for(int i = n-1; i>= 0; i--){
cout << num_arr[i];
}
cout << endl;
}
int numToArr(int num_arr[], int number){
int i = 0;
int n = log10(number) + 1;
for(int i = i; i< n; i++){
num_arr[i] = number % 10;
number /= 10;
}
return n;
}
main() {
int number = 1782698599;
int num_arr[MAX];
int n = numToArr(num_arr, number);
cout << "Initial Number: "; dispNumber(num_arr, n);
increment(num_arr, n);
cout << "Final Number: "; dispNumber(num_arr, n);
}実行結果
Initial Number: 1782698599 Final Number: 1782698600
このように、数値を整数型として直接保持するのではなく、桁ごとの配列として管理している場合でも、再帰を活用すれば繰り上がり処理を含む「1の加算」をシンプルかつエレガントに実現できます。特に、int型やlong long型の上限を超えるような巨大な数値を扱う場合に、この手法は非常に有効です。
-
Pythonで各桁の合計を1桁になるまで繰り返し計算する方法【デジタルルート】
正の整数 n が与えられたとき、そのすべての桁の数字を足し合わせて新しい数を作り、この操作を結果が10未満(1桁)になるまで繰り返すことを考えます。このようにして得られる「1桁に還元された数」はデジタルルート(数根)と呼ばれる有名な概念です。 例えば、入力が 9625 の場合、出力は 4 になります。計算の流れは以下のとおりです。 9 + 6 + 2 + 5 = 22 2 + 2 = 4 解法のアプローチ この問題は、再帰呼び出しを利用すると簡潔に解くことができます。具体的な手順は次のとおりです。 solve() メソッドを定義し、引数として n を受け取る n < 10 の場合、
-
配列を1つずつ時計回りに循環回転させるPythonプログラム
ユーザーが入力した配列を受け取り、その要素全体を時計回りに1つずつ循環的に回転させるのが本記事の目的です。最後尾の要素が先頭に移動し、それ以外の要素はそれぞれ後ろへ1つずつシフトされます。 実行例 入力:A = [1, 2, 3, 4, 5] 出力:[5, 1, 2, 3, 4] この例では、末尾の「5」が先頭に移動し、「1〜4」はそれぞれ1つ後ろへずれています。 アルゴリズムの手順 ステップ1:配列の要素を入力する。 ステップ2:配列の最後の要素を変数 x に保存する。 ステップ3:すべての要素を1つ後ろの位置へシフトする。 ステップ4:配列の先頭要素を x で置き換える。 ポイント