编写一个递归函数,将给定的字符串转换为它表示的数字。也就是说输入将是一个仅包含数字的数字字符串,您需要将字符串转换为相应的整数并返回答案。
我只得到字符串的第一位作为输出。例如,“ 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
答案 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" );