输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。

输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。
输入格式:
输入1个二进制数串(至少1位且不超过16位)。
输出格式:
输出转换后的十进制数。
输入样例:
0110110001100
输出样例:
3468

#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;
}

如有问题,点击头像联系我

温馨提示:答案为网友推荐,仅供参考
相似回答