在工作中我们时常需要将N进制转化成10进制
无论一个数是几进制,原理都一样——每一位的权重是N的n - 1次方.
比如8进制数:357 = 7 * 8^0 + 5 * 8^1 + 3 * 8^2;
2进制数:1001 = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3;
明白了这个原理,问题就基本解决了。
还有一个注意点是什么呢?
生活中十进制最大数用9表示,如果是16进制,10,11……15那么我们就用A,B……E表示(或者小写字母)。
如何得到我们想要的数字呢?
1.如果进制小于等于十进制,那么我们可以将得到的字符减去字符零。
2.如果进制大于等于十进制,那么我们可以将得到的字符减去‘A’在加上10,这样字符就换算成我们想要的答案了。
另外,我们需要编写一个strup()函数,将所有小写字母全部转化成大写字母。
/*
* N进制转十进制
* 作者:S
*/
#include <stdio.h>
#include <string.h>
void strup(char str[], int n);
int main()
{
char num[100] = { 0 }; //用于存放输入的数字
int n = 0; //表示n进制
int len = 0; //字符串的长度
int tmp = 0;
int sum = 0;
printf("please enter the numbers:>");
scanf("%s", num);
len = strlen(num);
strup(num, len);
printf("please enter the number base:>");
scanf("%d", &n);
for (int i = 0; i < len; i++)
{
if ((num[i] < 'A' && num[i] - '0' >= n) || num[i] - 'A' + 10 >= n)
{
printf("data error!\n");
exit(0);
}
if (num[i] <= '9' && num[i] >= '0')
{
tmp = num[i] - '0';
}
else if (num[i] >= 'A')
{
tmp = num[i] - 'A' + 10;
}
sum = sum * n + tmp;
}
printf("the decimal is %d\n", sum);
return 0;
}
/* 将字符数组中的小写字母转化成大写字母 */
void strup(char str[], int n)
{
for (int i = 0; i < n; i++)
{
if (str[i] >= 'a' && str[i] <= 'z')
{
str[i] -= 32;
}
}
}