C语言中能够直接进行二进制,八进制,十进制,十六进制之间的转换,但是有时候会碰到题目要求设计程序能进行六进制,七进制等等的进制转换,碰到这种题目的时候那就非常令人头疼了。
首先
我们要知道进制转换的底层逻辑:利用数字在不同进制下每一位计算权重的不同,进行不同的组合表示同一个数。(例如十进制78,用二进制表示是1001110,八进制表示为116,十六进制表示为4e。)
二进制从最低位开始每一位的计算权重为2^0,2^1,2^2,2^3……
八进制从最低位开始每一位的计算权重为8^0,8^1,8^2,8^3……
十进制,十六进制同理。
例:十进制78=7×10^1+8×10^0
二进制1001110=1×2^6+0×2^5+0×2^4+1×2^3+1×2^2+1×2^1+0×2^0=78(十进制)
八进制116=1×8^2+1×8^1+6×8^0=78(十进制)
十六进制4e=4×16^1+14×16^0=78(十进制)
在日常练习过程中我们经常能遇到求一个数各位数字的题,例如求十进制1234的各位数字,其解题逻辑为1234%10=4,然后1234/10=123,再123%10=3,然后123/10=12,再12%10=2,然后12/10=1,再1%10=1,直到1/10=0结束,所得余数依次为个位,十位,百位,千位。
代码运行实例如下:
也可以设计一个循环程序求随机数的各位数字,
代码运行实例如下:输入123456
//从上到下依次为个十百千万位......
而进制转换的本质就是通过计算得到给定数字在指定进制下每一位的数字,那么我们在进行进制转换时也可以利用同样的思维进行解题。
以上两个都是以十进制为背景的进制转换,那么我们也可以推广到求其他进制下各位数字,进而实现转换进制的目的。
例如将十进制1234转换为六进制数,代码运行实例如下:
同样也可以设计循环程序计算,代码运行实例如下:
//从上到下是给定进制下从最低位到最高位
进行进制转换时最好使用循环程序,避免因不知道转换后几位而产生错误。
因为日常生活中人们习惯使用十进制数,并且十进制数也更容易计算,所以在进行进制转换时最好先转化为十进制数再计算,可以设计程序将不同进制数转化为十进制数,代码如下:
#include<stdio.h>
int main()//不含十六进制
{
int x, p; //x输入数字 p该数的进制数
scanf("%d", &x);
scanf("%d", &p);
int y = 0, k = 1;
while (x != 0)
{
y = y + (x % 10) * k;
x = x / 10;
k = k * p;
}
printf("%d", y);
return 0;
}
代码运行实例如下:
上述程序仅能把任意进制数转化为十进制数,如果对其进行改造就可实现任意进制之间的转换。
代码如下:
int main()//不含十六进制
{
int x, p,q;//x为输入数字 p为该数的进制数 q为要转化的进制
scanf("%d", &x);
scanf("%d", &p);
scanf("%d", &q);
int y = 0, k = 1;
while (x != 0)
{
y = y + (x % 10) *k;
x = x / 10;
k = k * p;//每一位的权重
}
int arr[100] = { 0 }, i = 0;//arr用于存储所求数字的各位数(逆序)
//i即是数组下标又充当计数工具即所求数字位数
while (y != 0)
{
arr[i++] = y % q;
y /= q;
}
for (--i ; i >= 0; i--)//上一个while循环后i多加了1,因此使用i时要先减去1
{
printf("%d", arr[i]);
}
return 0;
}
以上都只能实现10进制及以下的转换,因为无法用%d的形式输入十六进制数,所以涉及到十六进制的转化需要使用的数组、字符串等概念。
后续涉及十六进制的问题,我会尽快补充。
到这里我们算是初步解决了一些简单的进制转换问题。
C语言的学习道阻且长,解决了一个问题,后续还会有无数的问题等着我们,因此我们要一直学习,坚持学习,不断查漏补缺,完善自己!
如果此文章对你有所帮助,就动动你的发财小手点个赞、点个关注吧!