对于十进制的数字“12345”来说,其真实大小就是:
即每一个位置的字符,仅能表示从0到9共十个意思,十个大小。当数字超过9之后,通过增加一个位置的字符来表达更大的数字。对于多位的数字的表达,则是通过每一位的字符乘以它进制大小的位置次幂求和来得到。
所以,对于二进制数字“10101”来说,其真实大小就是:
如果用十进制来表示“10101”这个二进制数字的话,就是“21”。
通过这个 思想,可以将任意进制的数字转化为十进制。
比如对于三进制的“21112”来说,其真实大小就是:
即其十进制下的表达为“203”。
同理,可以将这个思路逆向进行,以将十进制的数字转化为任意的进制表达。
比如,对于十进制下的数字“21”,若要将它表达为二进制数字:
首先将“21”这个数字除以2,看是否能够整除,如果能整除,则说明二进制表达中最小的一位是0,否则最小的一位是21除以2的余数。这就跟十进制中“如果30除以10,余数为0,则说明30的十进制表达中个位数为0”是一个道理。
接着再用除2后向下取整的十进制数确定二进制表达中第二小的位数字符,直到21这个数反复除以2变为0;
写出来的话就是:
21%2 = 1 ->二进制最后一位为 1;
21/2 = 10 、 10%2 = 0 ->二进制倒数第二位为0;
10/2 = 5 、 5%2 = 1 ->二进制倒数第三位为1;
5/2 = 2 、 2%2 = 0 ->二进制倒数第四位为0;
2/2 = 1 、 1%2 = 1 ->二进制倒数第五位为1;
1/2=0 ->结束。
即十进制数“21”表达为二进制的话就是“10101”。
这个算法思路其实就是用二进制数字一位一位的来表达十进制数字,每当用去一位二进制字符,十进制也相应的少去一个
其余任意进制的转化都是和二进制同理的,写出函数来的话,就是:
void ten_to_b (int * num,int b,int x)
{
int i = 0;
while(x)
{
num[i] = x%b;
x/=b;
i++;
}
}
即,将十进制数x转化为b进制数字,并逆序的一位一位存入了数组num中。
遵循上面所说的思路,如果输入了一个b进制的数字,想要写一个函数将其转换为十进制输出的话,首先要将数字一位一位的存入数组,然后每一位乘以b的位数幂,求总和再输出。写出函数来的话,就是:
int b_to_ten (int * num,int x,int b)
{
int i = 0;
while(x)
{
num[i] = x % 10;
x /= 10;
i++;
}
int j,zonghe=0,danwei=1;
for(j=0;j<i;j++)
{
zonghe += num[j]*danwei;
danwei *= b;
}
return zonghe;
}
至此就已经实现了任意进制转化为任意进制的程序编写了,若在给函数增加一个使数组逆序,并且对于大于9的数字转化为'A'、'B'...等字符输出的功能,就实现了<stdlib.h>库下的itoa()函数的全部功能。