#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define ARR_LEN 256
/* 任意进制数转十进制数 */
/* 算法原理: */
/* 10进制转换结果,为各位位码值乘以位权值之和 */
/* 位:从0开始,由低位依次向高位 */
/* 位码值:各位的10进制值 */
/* 位权值:进制的位次方 */
/* R进制数共n位,从低位至高位,第n位表示为Xn,对应10进制数D */
/* D = X0*R^0 + X1*R^1 + …… + X(n-1)*R^(n-1) + Xn*R^n */
/* 参数说明: */
/* char *value : 其他进制数,以字符串形式存储 */
/* int *result : 转换后的十进制数 */
/* int radix : 待转换的进制 */
int others2Decimal (char *value, int *result, int radix) {
char *p = value + strlen (value) - 1; /* 位指针,初始定位于最低位 */;
int weight = 1; /* 位权值,初始为进制的0次方,即为1 */
int digit; /* 位码值 */
*result = 0;
do {
/*取位值,兼容10以上进制的大小写字母*/
if (*p>='0' && *p<='9' && *p<(radix+'0'))
digit = *p-'0';
else if (*p>='a' && *p<='z')
digit = *p-'a'+10;
else if (*p>='A' && *p<='Z')
digit = *p-'A'+10;
else
return 0; /* 位值错误,返回非正常运行导致退出函数 */
*result += digit*weight; /*位码值乘以位权值之累加*/
/* 向高位移动一位并修正位权值 */
p--;
weight *= radix; /*位权值累乘进制,即对应位之进制的位次方*/
} while (p >= value);
return 1;
}
int main (void) {
char value[ARR_LEN];
int radix = 2;
int result;
printf ("请输入%d进制数:", radix);
fflush (stdin); /* 清除输入缓冲区 */
gets (value);
putchar ('\n');
puts ("================================================================\n");
if (!others2Decimal (value, &result, radix))
printf ("%d进制数%s错误!\n", radix, value);
else {
printf ("%d进制\t%s\n", radix, value);
printf ("10进制\t%ld\n", result);
}
putchar ('\n');
getch (); /*屏幕暂留*/
return 0;
}
如有问题,点击头像联系我