递归地将给定的字符串转换为其表示的数字

时间:2019-07-15 11:33:07

标签: c++ recursion

编写一个递归函数,将给定的字符串转换为它表示的数字。也就是说输入将是一个仅包含数字的数字字符串,您需要将字符串转换为相应的整数并返回答案。

我只得到字符串的第一位作为输出。例如,“ 1234”为1或“ 231”为2。这使我认为递归函数可能存在错误(尽管基本情况似乎还不错),但我无法弄清楚它是什么。

#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

int lenght (char input[]){
    int count = 0;
    for (int i=0 ; input[i] != '\0' ; i++){
        count++;
    }
    return count;
}

//helper
int stringToNumber(char input[], int start ) {
    int len = lenght(input);
    //base case
    if(start ==0){
        return int (input[start]) - 48;
    }
    int a = stringToNumber(input , start+1);
    int b = int(input[start]) - 48;

    int k = pow(10, len-1);
    return  k*b + a;
}

int stringToNumber(char input[]) {
    return stringToNumber(input, 0);
}

int main() {
    char input[50];
    cin >> input;
    cout << stringToNumber(input) << endl;
}
Sample Input 1 :
1231
Sample Output 1:
1231
What my code generates: 1

1 个答案:

答案 0 :(得分:1)

将字符串转换为十进制整数-实际上是将数字从十进制转换为二进制形式。即每个数字都是10的模。

即对于1234,可以像1 * 1000 + 2 * 100 + 3 * 10 + 4一样完成 或(1*10)+2, (12*10)+3, (123*10)+4。第二个算法可以像下一个递归函数一样实现:

constexpr uintmax_t atou(const char* a,uintmax_t ret = 0) noexcept {
    return '\0' == *a ? ret : atou(a+1, (ret * 10) + ( *a - '0') );
}

即您正在扫描字符串中的数字,直到行字符'\ 0'结束(例如std::isspace)为止,如果字符串中的更多数字与10乘以结果并将下一个数字相加。

static_assert( 1234 == atou("1234"), "1234 expected" );