将十进制转换为任何基数(对基数>=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 中任何基数的最快方法?