使用递归(C ++)的十进制到十六进制转换器

时间:2014-04-24 02:17:37

标签: c++ recursion hex decimal

尝试编写一个程序,将十进制数转换为实现递归的十六进制数

无法使用

之类的内容
cout << hex << x << endl; 

需要知道如何手动编写该功能。

我尝试了这个但是它没有真正起作用:

输入是用户输入的整数,ss在此函数之前不包含任何内容。

string convertHex(int num, ostringstream &ss)
{

    int x = num % 16;

    switch (x)
    {
        case 10: ss << "A"; return ss.str(); break;
        case 11: ss << "B"; return ss.str(); break;
        case 12: ss << "C"; return ss.str(); break;
        case 13: ss << "D"; return ss.str(); break;
        case 14: ss << "E"; return ss.str(); break;
        case 15: ss << "F"; return ss.str(); break;
        default: ss <<   x; return ss.str(); break;
    }

    return convertHex(num / 16, ss);

}

不确定我是否完全理解如何将十进制转换为十六进制,但更让我感到高兴的是让它与递归一起工作。有任何想法吗?

修改

我在awesomeyi建议的if语句中添加了,并在开关中取出了返回,现在它有点工作......但不是真的。这是新代码:

string convertHex(int num, ostringstream &ss)
{

    int x = num % 16;

    if (num == 0)
    {
        ss << 0;
        return ss.str();
    }

    switch (x)
    {
        case 10: ss << "A";  break;
        case 11: ss << "B";  break;
        case 12: ss << "C";  break;
        case 13: ss << "D";  break;
        case 14: ss << "E";  break;
        case 15: ss << "F";  break;
        default: ss << x;    break;
    }

    return convertHex(num / 16, ss);

}

它可以工作,但输出是向后的,并且在它的末尾添加零。如果我将十进制16转换为十六进制,它会给我010.如果我给它一个更大的数字,如4598,它给我6F110。 4598的正确十六进制值是11F6。

这是一项学校作业。我真的应该尝试修改吗?或者我应该在功能之后翻转它?

3 个答案:

答案 0 :(得分:0)

您的基本情况应该是num为0时的情况。现在,无论num是什么,您都会返回ss.str()。我想补充一点:

if(!num) return ss.str();

删除其他return ss.str()

答案 1 :(得分:0)

它会向后打印,因为这是您在递归中定义的内容:)

基本上它应该是这样的:

(伪代码)

printHex(int i) {
    if i == 0 {
        // do nothing
        return;
    }

    printHex( i / 16);
    print out hex value of i %16
}

如果你要返回一个字符串,同样,它应该看起来像:

(伪代码)

string toHex(int i) {
    if (i == 0)  {
        return "";
    }

    return toHex(i/16) + convertToHex( i % 16);
}

答案 2 :(得分:-1)

这是我的代码。

string convertDecToHex(int decimalNumber, string buffer)
{
    int x = decimalNumber % 16;
    char x_to_char = x + '0';
    if (decimalNumber == 0)
    {
        return buffer;
    }
    switch (x)
    {
    case 10: buffer = 'A' + buffer; break;
    case 11: buffer = 'B' + buffer; break;
    case 12: buffer = 'C' + buffer; break;
    case 13: buffer = 'D' + buffer; break;
    case 14: buffer = 'E' + buffer; break;
    case 15: buffer = 'F' + buffer; break;
    default: buffer = x_to_char + buffer;
    }
    return convertDecToHex(decimalNumber / 16, buffer);
}