问题描述:
实现带小数的二进制数到十进制数的转换。二进制字符序列以字符‘#’结尾, 如
“1011.101#”。 将二进制数“1011.101”转换为十进制数。
二进制字符序列中只可能存在‘0’、‘1’、‘.’、‘#’ 4种字符,不会出现任何其他字符。
为了提高结果精度,建议使用double类型的变量存储结果。
输入与输出要求:
输入一个以‘#’结尾的字符序列,代表待转换的二进制数。 输出转换后的十进制数,如果二进制数有小数部分,则输出结果保留6位有效数字;如果二进制数没有小数部分,则输出结果中没有小数点和小数部分。
程序运行效果:
Sample 1:
Please input the binary string: 11001.0110#
The result is: 25.375000
Sample 2:
Please input the binary string: 1101#
The result is:13
无数组版本:
main()
{
char a,b;
float sum = 0, flag = 0, i = -1;
printf("Please input the binary string:");
while((a = getchar()) != '#')
{
if(a != '.')
{
sum = sum * 2 + a - '0';
}
if(a == '.')
{
flag = 1;
break;
}
}
while(flag == 1 && (b = getchar()) != '#')
{
sum += pow(2, i) * (b - '0');
i--;
}
if(flag == 1)
printf("The result is:%f\n", sum);
else
printf("The result is:%d\n", (int)sum);
}
有数组版本:
#include
#include
main()
{
char a[100];
int i, j, n;
double sum= 0;
printf("Please input the binary string:");
gets(a);
for(n= 0; a[n]!= '#'; n++) /*确定字符序列长度*/
;
for(i= 0; a[i]!= '.' && i< n; i++) /*确定小数点的位置*/
;
for(j=0; j< i; j++)
sum= sum* 2 + (a[j]- '0');
for(j=5; j< n; j++)
sum= sum+ (a[j]- '0') * pow(2,i - j);
if(i!= n)
printf("The result is: %f", sum);
else
printf("The result is: %d", (int)sum );
return 0;
}