C/C++学习笔记:C语言实现任意进制转换,代码全解析!
问题描述
给定一个 M 进制的数 x,实现对 x 向任意的一个非 M 进制的数的转换。
问题分析
掌握不同数制间的转换关系是解决问题的关键,这里所说的数制一般包括二进制、八进制、十六进制及十进制。除了不同的数制还有下面几个必须要了解的概念。
基数:在一种数制中,只能使用一组固定的数字来表示数的大小,这组固定的数字的个数就称为该计数制的基数(Base)。例如十进制的基数为10,二进制的基数为2等。
权:又称为位权或权值,即每一个数位都有一个固定的基值与之相对应,称之为权。如十进制的个位对应的权值为1(100),十位对应的权值为10(101),百位对应的权值为100(102)。对于一个 M 进制的数来说,小数点左边各位上对应的权值从右到左分别为基数的0次方、基数的1次方、基数的2次方等,对于小数点右边各位上对应的权值从左到右分别为基数的-1次方、基数的-2次方等。
二进制、八进制、十六进制向十进制转换:按权展开相加。
十进制转换成二进制、八进制、十六进制:整数部分除以基数取余数(取余的方向为从后向前);小数部分乘以基数取整数(取整的方向为从前向后)。
二进制、八进制、十六进制相互转换:先转换成十进制再转换成其他进制;或者按照其对应关系进行转换(三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数)。本例题按照前一种转换方式进行编程。
算法设计
十六进制是由 0~F 这一组固定的数字来表示,所以釆用字符数组进行存储。在进行输入输出时数组元素都是以字符的形式存在的,但是在进行数制转换时数组元素又以数值的形式存在,程序中用两个自定义函数 char_to_number 和 number_to_char 来实现字符与其对应数值之间的转换。
在执行程序时可以输入多组数据来验证程序的正确性,以前的程序都是多次运行,输入不同的数据来实现。对程序稍做改进,只运行一次程序但可以输入多组数据进行验证。解决这个问题只需要加一层循环,如果循环条件为真则继续输入数据,否则退出。循环条件为真即表达式的值不为0,这样可以声明一个变量假设为 flag,利用语句 while(flag){循环体} 来进行控制,当 flag 的值为1时可以接着输入,若为0则结束循环。
下面是完整的代码:
#include
#define MAXCHAR 101 /*最大允许字符串长度*/
int char_to_num(char ch); /*返回字符对应的数字*/
char num_to_char(int num); /*返回数字对应的字符*/
long source_to_decimal(char temp[], int source); /*返回由原数转换成的10进制数*/
int decimal_to_object(char temp[], long decimal_num, int object); /*返回转换成目标数制后字符数组的长度*/
void output(char temp[], int length); /*将字符数组逆序打印*/
int main()
{
int source; /*存储原数制*/
int object; /*存储目标数制*/
int length; /*存储转换成目标数制后字符数组的长度*/
long decimal_num; /*存储转换成的10进制数*/
char temp[MAXCHAR]; /*存储待转换的数值和转换后的数值*/
int flag = 1; /*存储是否退出程序的标志*/
while(flag) /*利用输入的flag值控制循环是否结束*/
{
printf("转换前的数是:");
scanf("%s", temp);
printf("转换前的数制是:");
scanf("%d", &source);
printf("转换后的数制是:");
scanf("%d", &object);
printf("转换后的数是:");
decimal_num = source_to_decimal(temp, source);
length = decimal_to_object(temp, decimal_num, object);
output(temp, length);
printf("继续请输入1,否则输入0:");
scanf("%d", &flag);
}
return 0;
}
/*将字符转换成数字*/
int char_to_num(char ch)
{
if(ch>='0' && ch<='9')
return ch-'0'; /*将数字字符转换成数字*/
else
return ch-'A'+10; /*将字母字符转换成数字*/
}
char num_to_char(int num)
{
if(num>=0 && num<=9)
return (char)('0'+num-0); /*将0~9之间的数字转换成字符*/
else
return (char)('A'+num-10); /*将大于10的数字转换成字符*/
}
long source_to_decimal(char temp[], int source)
{
long decimal_num = 0; /*存储展开之后的和*/
int length;
int i;
for( i=0; temp[i]!='\0'; i++ );
length=i;
for( i=0; i<=length-1; i++ ) /*累加*/
decimal_num = (decimal_num*source) + char_to_num(temp[i]);
return decimal_num;
}
int decimal_to_object(char temp[], long decimal_num, int object)
{
int i=0;
while(decimal_num)
{
temp[i] = num_to_char(decimal_num % object); /*求出余数并转换为字符*/
decimal_num = decimal_num / object; /*用十进制数除以基数*/
i++;
}
temp[i]='\0';
return i;
}
void output(char temp[], int length)
{
int i;
for( i=length-1; i>=0; i--) /*输出temp数组中的值*/
printf("%c", temp[i]);
printf("");
}
运行结果:
C/C++学习笔记:C语言实现任意进制转换,代码全解析!相关推荐
- c语言进制转换pdf下载,C语言实现任意进制转换.doc
C语言实现任意进制转换.doc includestdio.h#includemath.h#includestring.hvoid dtox(double num,int jz)char xnum100 ...
- 数据结构学习笔记:利用栈实现进制转换
数据结构学习笔记:利用栈实现进制转换 一.除基倒取余法示意图 二.编写十进制转换成二进制Python程序 1.源代码 2.运行结果 其实Python提供了一
- c++将小数化为二进制_C/C+学习笔记:C语言实现任意进制转换,代码全解析!...
问题描述 给定一个 M 进制的数 x,实现对 x 向任意的一个非 M 进制的数的转换. 问题分析 掌握不同数制间的转换关系是解决问题的关键,这里所说的数制一般包括二进制.八进制.十六进制及十进制.除了 ...
- 各种进制转换最简单总结(附任意进制转换代码)
A进制转B进制 A=10? 1.A=10->A除B取余至余数为0,将余数从下往上连接即可: 2.A!=10->A从右往左第i位*A的i次方(i从0开始)转成10进制: 16和8之间的转换要 ...
- c语言oj答案进制转换,C语言编程的进制问题问题
在我们的编译器,我用的是ADS 开发平台,现在RTC模块编程时,2410作为上位机,如下代码: n = rBCDDATE; if(n==1) time->day =0x31 ; 波斯历的日期 ...
- 任意进制转换的递归实现
任意进制转换的递归实现 原始链接:http://weolee.spaces.live.com/blog/cns!52FBB34F02E029D9!650.entry www.163online.cn ...
- 在线2-36任意进制转换工具
在线2-36任意进制转换工具 在线2-36任意进制转换工具 本工具支持将数字从在2-36进制中任意进制间相互转换,只支持整数,纯客户端实时计算. https://tooltt.com/hex/
- c语言进制转换实验报告,c语言_各种进制转换.docx
c语言_各种进制转换.docx c 语言 各种进制转换 计算机中常用的数的进制主要有二进制.八进制.十六进制. 2 进制,用两个阿拉伯数字0.1: 8 进制,用八个阿拉伯数字0.1.2.3.4.5.6 ...
- 任意进制转换成十进制间互化(ASCII码法)(C/C++)
目录 1 最早的版本(C) 2 针对上面的问题进行改进(C++) 2.1 任意进制转换成十进制(运用字符串) 2.2 十进制转换成任意进制(运用数组逆序存储+取模作除法) 3 ASCII码参考 ...
最新文章
- Java环境及Eclipse(MyEclipse)安装
- 深入SpringBoot:自定义Endpoint
- c# 水晶报表中处理TextObject
- CentOS6.5安装Redis3.2.8版本
- is transfer = C ( only read dynamically) not supported in one order scenario
- eja智能压力变送器工作原理_压力变送器的原理、接线和安装方法
- 数据算法排序之归并排序
- Angular 在洋葱圈的实践与思考
- 数据结构:实验一 线性表的基本功能实现
- javaweb教程 javaweb项目路径总结
- ArcGIS/ArcMAP操作录屏视频及相关实验数据(行政界线、地名点、道路路网、水系、乡镇/街道面等)
- c语言求圆锥的表面积和体积_有关C语言:求圆锥体的体积和表面积,急!!!!!!1...
- 你们要的日文AI实时字幕来了,谷歌浏览器VS小白浏览器AI大比拼
- java刮刮乐,20行JS代码实现网页刮刮乐效果
- python font 斜体_用PIL绘制粗体/斜体文字?
- 计算机win7开超级性能模式,电脑如何打开高性能模式?[多图]
- 拍摄失败导致照片像素低,学会这个可以一键高清修复
- 如何解决百度云下载慢的问题
- redhat开启telnet后无法连接
- vim下:wq和ZZ命令还是有区别的
热门文章
- 修改wap游戏服务器,修改wap游戏服务器
- pycharm镜像源_pycharm安装第三方库
- (硬 核)使用MySQL管理和查询数据 ( 入 门 须 知 ②)
- Linux系统查看系统硬件,linux怎么查看系统硬件信息
- 计算机仿真在哪学,计算机仿真软件有哪些
- mysql 1786_mysql错误处理之ERROR 1786 (HY000)
- c语言不同类型变量用什么表示什么作用,C语言数据类型及变量整理
- 视频容器与编解码器的区别
- oracle与mysql的区别总结(一)
- i茅台app上线首日,直接冲到了App Store免费榜第一