【编程练习】进制转换问题

1

前言

进制转换有如下几种常见情况:

  • 十进制转换为其他进制

  • 其他进制转换为十进制

  • 二进制转换为其他进制

  • 八进制转换为其他进制

  • 十六进制转换为其他进制

2

十进制转换为其他进制

十进制转其他进制:取余法。下面以十进制转二进制为例,请看下图:

所以十进制105对应的二进制数为1101001,即最后一个余数写在前面,以此类推写到最后一个余数。同样的,十进制数转换为其他进制数也遵循这样的规则。

由此可设计出如下函数:

int deci_to_other_scale(uint deci_num, int scale, char s[])
{
 static char ch[] = "0123456789ABCDEF";
 char buf[N + 1];
 int i = N, j;
 
 if ( !(scale >= 2 && scale <= 16) )
 {
   s[0] = '\0';
   return 0;
 }

buf[N] = '\0';
 do
 {
   buf[--i] = ch[deci_num%scale];
   deci_num /= scale;
 }while(deci_num);
 
 for ( j = 0; j < N-1; j++ )//for ( j = 0; (s[j] = buf[i])!='\0'; i++, j++ );
 {
   s[j] = buf[i];
   i++;
 }
 
 return j;
}

定义一个数组buf,用于保存余数,数组最后一个元素保存第一个余数,倒数第二个元素保存第二个余数,依次类推。

然后再把数组buf的元素值依次赋给函数的形参s[],这里把形参s[]称为输出参数,因为这个参数可以把函数内的数据带到该函数外使用。

3

其他进制转换为十进制

以八进制数转化为十进制数为例。如下图:

所以其他进制转换为十进制,首先需要分离出该进制数的各位数,再按权展开,相加即得十进制数。

由此可设计出如下函数:

/*
 如八进制776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510
*/
int other_scale_to_deci(char *other_num, int scale)
{
 const char figure[] = "0123456789ABCDEF";
 
 char i, j;
 char other_len = strlen(other_num), figure_len = strlen(figure);
 char deci_num[other_len];
 int deci_sum = 0;
 char flag = 0;

/* 分离scale进制数的各位,如八进制776分离成7,7,6 */
 for ( i = 0; i < other_len; i++ )
 {
   for ( j = 0; j < scale; j++ )
   {
     if ( other_num[i] == figure[j] )
     {
       deci_num[i] = j;  
       flag = 1;
     }
     
   }
   /* 不是scale进制数则退出函数 */
   if(flag == 0)
   {
     printf("Input Error!Please Input Again!\n");
      return 0;
   }
   flag = 0;
   
 }

/* scale进制转化为十进制,如八进制转换为十进制数:776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510 */
 for ( i = 0; i < other_len; i++ )
 {
   deci_sum += deci_num[other_len-1-i]*pow(scale, i);
 }

return deci_sum;
}

4

二进制转换为其他进制

二进制转换为其他进制:先把二进制转化为十进制数,十进制数再转化为其他进制数。(可调用以上两个函数完成)

可设计如下函数:

int binary_to_other_scale(char *binary_num, int scale, char s[])
{
 int deci_sum = 0;

deci_sum = other_scale_to_deci(binary_num, TWO_SCALE);

return deci_to_other_scale(deci_sum, scale, s);
}

5

八进制转换为其他进制

八进制转换为其他进制:先把八进制转化为十进制数,十进制数再转化为其他进制数。

可设计如下函数:

int oct_to_other_scale(char *oct_num, int scale, char s[])
{
 int deci_sum = 0;

deci_sum = other_scale_to_deci(oct_num, EIGHT_SCALE);

return deci_to_other_scale(deci_sum, scale, s);
}

6

十六进制转换为其他进制

十六进制转换为其他进制:先把十六进制转化为十进制数,十进制数再转化为其他进制数。

可设计如下函数:

int hex_to_other_scale(char *hex_num, int scale, char s[])
{
 int deci_sum = 0;

deci_sum = other_scale_to_deci(hex_num, SIXTEEN_SCALE);
 
 return deci_to_other_scale(deci_sum, scale, s);
}

以上就是各进制之间的转换函数。核心函数为:“十进制转换为其他进制”与“其他进制转换为十进制”。其他函数都是根据这两个函数设计的。程序测试范例结果如下:

(0)

相关推荐

  • 初学C语言-循环

    for(;;;) 一切能用while循环的语句都可以使用for循环实现 while() 循环   不满足括号内容时结束循环; 先简单写一个while循环 吃小笼包子,吃到第三个包子吃出一条虫 #inc ...

  • VBA如何进行数制转换,十六进制转换、八进制转换不再是难事

    No.1 数制转换在计算机编程中应用很普遍,而且也是比较难的一个操作. 在学习二进制和八进制或十六进制之前,我们通常普遍学习的是十进制计算. 这也是一个让你迷惑的事情,很多时候可能有些人并不清楚,什么 ...

  • 进制转换及算法!进阶必学!

         首先,祝贺视频课程学员数突破10万!全5分好评!      非常,非常,非常感谢大家的认可和支持!      将继续发放50元视频直购优惠券,文末点"阅读原文"即可领取! ...

  • (7条消息) 进制转换( QString 转换为 Hex ByteArray)

    QString 转换为 Hex ByteArray void SimSerialPort::convertStringToHex(const QString &str, QByteArray ...

  • 4.13 进制转换与符号函数base和sign

    4.13 进制转换与符号函数base和sign

  • 每日一题C++版(进制转换)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 小学奥数(第008课) 进制转换练习题

    小学奥数(第008课) 进制转换的相应练习题,有兴趣的同学可以做一做. ①心算 1.把二进制数(101)2改写成十进制数是( ). 2.把九进制数(120)9改写成十进制数是(. ). 3.一个八进制 ...

  • 进制转换和变量解释

    进制转换和变量解释

  • 常用各种进制之间的转换

    原创大军电工2021-05-16 09:21:10 在电学中经常会遇到数字间的进制转换,比如plc就必须了解相关知识点.很多人对这一块一直都是很模糊,或者说时间一长呢,总有点忘.今天我整理了一下,常用 ...

  • java学习——99.进制间的转换

    计算机中的计算机器是可以直接实现进制间转换的功能的. 也可以自己写用户界面来实现各种进制之间的转换. 本篇即采用用户界面来实现进制的转换,代码有点长,感兴趣的朋友看看,主要是结合了前两篇的转换,再加上 ...

  • java学习——97.进制间的转换

    这两个星期被各种杂事充斥了生活,不过,生活,本来就是充满了波折,波折也是一种成长,希望我能继续成长下去. 今天要写的是进制间的转换. 其实这是一个很简单的题目,现在大学里就算是非计算机专业,也会有一门 ...