C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++におけるatoi()の再帰的実装方法を解説

はじめに

数値を含む文字列が与えられたとき、再帰的なatoi()メソッドを用いて、その文字列に対応する整数値を求めることを目指します。int atoi(const char *str)は、文字列引数strを整数型(int)に変換する関数です。

実行例

入力 − Str[] = "58325"
出力 − 変換された10進数:58325
説明 − 文字列には数値58325が含まれており、それがそのまま整数として変換されます。

入力 − Str[] = "00010"
出力 − 変換された10進数:1
説明 − 文字列には先頭に余分な0を含む数値10が格納されており、変換後は「1」ではなく「10」相当の値として処理されます。

アルゴリズムの考え方

このアプローチでは、入力文字列とその長さを受け取る再帰関数recurAtoi()を使用します。各文字を順番に処理し、それまでの結果に10を掛けた値に、現在の文字の数値を加算していくことで、文字列全体を整数に変換します。

  • 数値を含む入力文字列Str[]を受け取ります。
  • strlen(Str)を使用して文字列の長さを計算します。
  • 関数recurAtoi(char *str, int len)が入力を受け取り、再帰的なatoi()の機能によって計算された数値を返します。
  • 文字列の長さが1の場合、*str - '0'によって得られる桁の値を返します。
  • temp = 10 * recurAtoi(str, len-1)として、これまでの結果に10を掛けます。
  • temp = temp + str[len-1] - '0'として、最後の文字に対応する数値を加算します。
  • 最終的にtempを返します。
  • 結果を出力します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int recurAtoi(char *str, int len){
    if (len == 1){
        return *str - '0';
    }
    int temp=10*recurAtoi(str,len-1);
    temp=temp+str[len-1]-'0';
    return (temp);
}
int main(void){
    char Str[] = "58325";
    int length = strlen(Str);
    cout<<"Equivalent decimal :"<<recurAtoi(Str, length);
    return 0;
}

出力結果

上記のコードを実行すると、以下の出力が生成されます。

Equivalent decimal : 58325

まとめ

このように、再帰関数を活用することで、ループ処理を使わずに文字列を整数へと変換できます。再帰呼び出しのたびに文字列の末尾から1文字ずつ処理し、既存の結果を10倍して新しい桁を追加していくというシンプルな仕組みがポイントです。文字コードと数字の関係('0'との差分)を利用すれば、文字から数値への変換も容易に行えます。

  1. C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム

    問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン

  2. C++のstatic_castとは?基本からエラー例まで解説

    static_castとはstatic_castは、C++における通常の型変換(キャスト)を行うための演算子です。暗黙的な型変換を担う役割もあり、明示的に記述して呼び出すこともできます。例えば、floatからintへの変換、charからintへの変換などが代表的な使用例です。また、継承関係にあるクラス同士(基底クラスと派生クラス)のポインタ変換にも利用できます。C言語風のキャスト((int)x のような書き方)と比べると、static_castは意図が明確になり、コンパイラによる型チェックも働くため、より安全で可読性の高いコードになります。基本的な使用例以下は、float型の値をint型に変換