#include <iostream.h>
#include <math.h>
#include <conio.h>
int main()
{
int binNum, decNum = 0;
int numWidth; //输入的数字的位数
int numBit; //每一位的数
cout <<"Input a binary number ";
cin >>binNum;
numWidth = ceil( log10( binNum ) ); //确定输入的是几位数
for( int i = numWidth - 1; i >= 0; i-- ) {
numBit = binNum / ( ( int ) pow( 10, i ) ) % 10;
decNum += numBit * pow( 2, i );
}
cout <<"\nThe decimal value of input number is: " <<decNum <<endl;
getchar ();
return 0;
}
哪里有问题??怎么得到的结果都是0阿??
写的太费事了,怎么都用上pow了
不过程序看上去没问题呀!
我试了一下结果也正确。
你但不跟踪看看。
你都输入了什么数呀?
你在Borland C++3.1下试试:
应该是
for( int i = numWidth ; i >= 0; i-- )
不是
for( int i = numWidth - 1; i >= 0; i-- )
出现308是溢出了,不断的numWidth++ 到最大时是10^308。
应该是while ( binNum / pow (10, numWidth+1 ) >= 0.001 ){
numWidth++;}
做浮点型,在内存当中是有一定的精度的,否则是不可能相等的。
我认为不如输入字符串分析得还快一些,入输入char p〔〕=“1010”则
p〔0〕就是1,p〔1〕就是0 然后atoi转换不就可以了吗。然后根据位数pow不就可以了吗。
我用vc跟踪了一下,发现一个问题。
当输入1000时numWidth的值是3,显然少记了一位。
当输入1001时numWidth的值是4, 正确
numWidth = ceil( log10( binNum ) ); //确定输入的是几位数
楼上说的对,就是这句不对,当输入一个能被10整除的数的时候,长度少了1。
所以要改成
numWidth = ceil( log10( binNum+1 ) ); //确定输入的是几位数
应该是for( int i = numWidth ; i >= 0; i-- ) ,还有这里可以改成,
numBit = (long)binNum / ( ( long ) pow( 10, i ) ) % 10;
来防止溢出。不过输入4、5位数都不会溢出的吧,