解题思路分析
- 二进制转十进制原理:二进制数转换为十进制数的基本原理是按位权展开相加。对于一个二进制数,从右往左每一位的位权依次是
将每一位上的数字(0 或 1)乘以其对应的位权,然后把所有结果相加,就得到了对应的十进制数。 - 程序实现思路:
- 首先要能正确接收从键盘输入的二进制正整数。可以使用合适的输入函数(如 C 语言中的函数),并指定正确的格式来读取输入。
- 然后通过循环结构,从二进制数的最低位(最右边一位)开始,依次获取每一位上的值,并按照位权展开的方法计算出对应的十进制值,将这些值累加起来得到最终的十进制数。
易错点分析
- 输入格式错误:如果没有正确指定输入函数的格式控制符,可能导致无法正确读取输入的二进制正整数。比如,若应该用格式读取长整型二进制数,却用了格式,就可能出现输入错误。
- 循环终止条件错误:在使用循环语句处理二进制数每一位时,若循环终止条件设置不当,可能无法完整处理所有位,或者多处理了不存在的位。例如,应该以二进制数变为作为循环终止条件,如果设置成其他条件,就会出现问题。
- 位权计算错误:在按照位权展开相加计算十进制数时,如果位权计算错误,比如把某一位的位权算错了(应该是形式,为该位从右往左的序号减一),那么最终计算出的十进制数也会是错误的。
#include <stdio.h>
#include <math.h>int main() {// 定义一个字符数组,用于存储从键盘输入的二进制数,最多可存储32个字符char binary[32];// 使用scanf函数读取用户从键盘输入的字符串形式的二进制数,并将读取成功的个数返回给result// %s是用于读取字符串的格式控制符,这里会将输入的二进制数存储到binary数组中int result = scanf("%s", binary);// 判断scanf函数是否成功读取到一个有效的输入(即返回值为1)// 如果读取失败(返回值不为1),则输出提示信息并返回错误码1,表示程序出现错误if (result!= 1) {printf("输入错误!\n");return 1;}// 定义一个整型变量,用于存储最终转换得到的十进制数,初始化为0int decimal = 0;// 定义一个整型变量,用于记录输入的二进制数的长度,初始化为0int length = 0;// 通过循环遍历binary数组,找到字符串的结束标志'\0',从而确定输入的二进制数的长度// 每循环一次,length的值就增加1,直到遇到'\0'为止while (binary[length]!= '\0') {length++;}// 使用for循环遍历输入的二进制数的每一位// i从0开始,每次增加1,直到小于输入的二进制数的长度length为止for (int i = 0; i < length; i++) {// 将二进制数的每一位字符转换为对应的数字值('0'转换为0,'1'转换为1)// 然后乘以2的相应位权次方,再累加到decimal变量中,实现二进制到十进制的转换// 位权计算方式为2的(length - i - 1)次方,即从右往左依次为2^0、2^1、2^2等decimal += (binary[i] - '0') * pow(2, length - i - 1);}// 使用printf函数输出输入的二进制数以及对应的十进制数// %s用于输出字符串形式的二进制数,%d用于输出整型的十进制数printf("二进制%s对应的十进制是%d\n", binary, decimal);return 0;
}