将十进制转换为任何基数(对基数>=10 使用 switch 语句)

Posted

技术标签:

【中文标题】将十进制转换为任何基数(对基数>=10 使用 switch 语句)【英文标题】:Convert decimal to any base (using switch statement for base>=10) 【发布时间】:2021-12-30 15:18:57 【问题描述】:

我正在尝试使用 switch 语句来转换十进制数 放入一个基数(大于 9)并将余数保存到一个数组中, 但是,我没有得到想要的结果,因为看起来我弄乱了 switch 语句。 示例:200(10) = 678(16)

#include <iostream>

using namespace std;

int main()

    int x,y,yCopy,q,r,cnt=0;
        cout << "Select a base for your number from 2 to 16 : ";
        cin >> x;
        cout << "Enter a decimal number in order to transform it to the selected base : " << endl;
        cin >> y;
            yCopy=y;

    do
        yCopy=yCopy/x;
        cnt++;
    while(yCopy!=0);
        yCopy=y;

        int result[cnt];

    if(x>1 && x<10)
        for(int i=cnt-1; i>=0;--i)
            r=yCopy%x;
            result[i]=r;
            yCopy=yCopy/x;
        

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i)
            cout << result[i];
        
        cout << "(" << x <<  ")" << endl;
    

    if(x>9 && x<17)
        for(int i=cnt-1; i>=0;--i)
            r=yCopy%x;
            switch(r)
            case 10 : r='A'; break;
            case 11 : r='B'; break;
            case 12 : r='C'; break;
            case 13 : r='D'; break;
            case 14 : r='E'; break;
            case 15 : r='F';
            
            result[i]=r;
            yCopy=yCopy/x;
        

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i)
            cout << result[i];
        
        cout << "(" << x << ")" << endl;
    

return 0;

【问题讨论】:

不相关:x 对于表示基数的变量来说是一个非常糟糕的名称。为什么不称它为base 并减少代码读者所需的认知负担? y 也有类似的问题。 q 也是一个非常糟糕的变量名。如果该变量从未被使用过,您甚至都不会注意到。 也不相关,我认为每个案例都需要一个break语句,包括“case:15”。还同意您应该大大改进您的命名约定,尝试使用驼峰或下划线,然后使用 1-3 个单词来描述该变量 提示:字符C的ASCII码是67。 int 表示"integer"。您的程序只打印整数变量。你不应该期望任何整数是C 【参考方案1】:

谢谢大家的澄清! 正如你们中的一些人提到的,我在这里错误地使用了数据类型。 我已将数组更改为 char(对于 bases>=10), 为 nums 0-9 添加了几个案例,并且有效。 非常感谢!

if(base>9 && base<17)
        char remainder;
        char arr[cnt];
        for(int i=cnt-1; i>=0;--i)
            remainder=yCopy%base;
            switch(remainder)
            case 0 : remainder='0'; break;
            case 1 : remainder='1'; break;
            case 2 : remainder='2'; break;
            case 3 : remainder='3'; break;
            case 4 : remainder='4'; break;
            case 5 : remainder='5'; break;
            case 6 : remainder='6'; break;
            case 7 : remainder='7'; break;
            case 8 : remainder='8'; break;
            case 9 : remainder='9'; break;
            case 10 : remainder='A'; break;
            case 11 : remainder='B'; break;
            case 12 : remainder='C'; break;
            case 13 : remainder='D'; break;
            case 14 : remainder='E'; break;
            case 15 : remainder='F';
            
            arr[i]=remainder;
            yCopy=yCopy/base;
        

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i)
            cout << arr[i];
        
        cout << "(" << base <<  ")" << endl;
    

【讨论】:

危险:char arr[cnt]; 可变长度数组是非标准 C++ 扩展。

以上是关于将十进制转换为任何基数(对基数>=10 使用 switch 语句)的主要内容,如果未能解决你的问题,请参考以下文章

将基数为 10 的数字转换为 .NET 中任何基数的最快方法?

将小数转换为混合基数(基数)

以其他基数表示负数

当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?

小数的二进制补码

在prolog中将基数10转换为基数2