在C ++中使用带递归函数的开关

时间:2015-11-04 17:43:16

标签: c++ recursion switch-statement

我正在创建一个程序,使用递归将任何基数10转换为任何其他基数,最多36个,我找不到合适的位置来将我的开关用于将大于9的递归函数返回的任何余数更改为其信对应。 (A = 10,B = 11 ......)我的转换函数使用递归,似乎使得实现切换更加困难。放置开关的适当位置在哪里?

将200从十进制转换为十六进制应为c8。我的程序将其打印为128. 12应该是c,这是交换机的用途。

我正在使用递归,因为它是一种非常简单的转换为新基础的方法。 截至目前,程序运行但仍然继续输出数字而不是切换。感谢您的回复!

#include <iostream>
#include <string>
#include<cstdlib>

using namespace std;

int baseConversion(int num, int base);

int main()
{
    int numInput;
    int baseInput;

    cout << "Enter number for conversion: " << endl;
    cin>>numInput;
    cout<<"Enter the base you would like the number converted to: "<<endl;
    cin>>baseInput;

//int temp2 = baseConversion(numInput,baseInput);


cout << numInput <<" to the base "<<baseInput<<" is: ";
switch(baseConversion(numInput,baseInput))
{
    case 10:
    cout << "A";
    break;
    case 11:
    cout << "B";
    break;
    case 12:
    cout << "C";
    break;
    case 13:
    cout << "D";
    break;
    case 14:
    cout << "E";
    break;
    case 15:
    cout << "F";
    break;
    case 16:
    cout << "G";
    break;
    case 17:
    cout << "H";
    break;
    case 18:
    cout << "I";
    break;
    case 19:
    cout << "J";
    break;
    case 20:
    cout << "K";
    break;
    case 21:
    cout << "L";
    break;
    case 22:
    cout << "M";
    break;
    case 23:
    cout << "N";
    break;
    case 24:
    cout << "O";
    break;
    case 25:
    cout << "P";
    break;
    case 26:
    cout << "Q";
    break;
    case 27:
    cout << "R";
    break;
    case 28:
    cout << "S";
    break;
    case 29:
    cout << "T";
    break;
    case 30:
    cout << "U";
    break;
    case 31:
    cout << "V";
    break;
    case 32:
    cout << "W";
    break;
    case 33:
    cout << "X";
    break;
    case 34:
    cout << "Y";
    break;
    case 35:
    cout << "Z";
    break;
    default:
        cout <<baseConversion(numInput,baseInput);
    }
    cout<<endl;

return 0;
}

int baseConversion(int num, int base)
{
if(num == 0 || base == 10)
    return num;

return (num% base) + 10*baseConversion(num / base, base);

}

`

2 个答案:

答案 0 :(得分:0)

这是一个粗略的递归基本转换函数,可以帮助您理解它与您所做的之间的区别:

std::string baseConversion(int num, int base)
{
   std::string result;
   if (num>=base) result = baseConversion(num/base, base);
   num %= base;
   if (num<10) result += (char)('0' + num); else result += (char)('A'+num-10);
   return result;
}

该函数在num<base时以空字符串开头,或者在num>=base时以最右边的数字(递归计算)开始。

然后它将最后一位数字附加到该数字。

答案 1 :(得分:0)

你真的不需要一个开关,正如评论中所指出的那样:这可以这样做

string f(int n, int base) {
    string res = "";
    if (n < base) 
        res += n < 10 ? n : n + 'A' - 10;
    else {
        string t = f(n / base, base); 
        res += t + (n % base) < 10 ? n % base : (n%base) + 'A' - 10; //t should be on LHS
    }
    return res;
}

另外,请注意您应该将单个字符追加到字符串或字符数组中,而不是像往常一样将其附加到int数据类型。

再次在评论中指出,除非仅仅是为了学习,否则不需要递归。