题目: 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进制加法运算,再将结化为十进制数输出。 (二进制加法规则:0+0=0 0+1=1 1+0=1 1+1=10 )
提示:在数组里运算。
思路:先将输入的数转成二进制,此时数是倒着排的即二进制的最低位在x[0],我们打印的时候把它正过来;做加法时模拟二进制加法规则,再考虑进位,这里我用的while循环,循环退出的条件是两个数都加完且最高位无进位。如果有一个数位数较少先加完了,那么我们把这个数高位补0。最后化成10进制时用的pow函数是C语言的库函数,你们自己查一下。
#include < iostream > #include < cmath > using namespace std; int Convert( long , char * ); void Display( char * , int ); int Plus( char * , int , char * , int , char * ); long ToDecimal( char * , int ); int main(){ long x,y; cout << " Input the first number: " ; cin >> x; cout << " Input the second number: " ; cin >> y; char xbin[ 50 ],ybin[ 50 ]; int xbin_len,ybin_len; xbin_len = Convert(x,xbin); ybin_len = Convert(y,ybin); Display(xbin,xbin_len); Display(ybin,ybin_len); char result[ 50 ]; int result_len = Plus(xbin,xbin_len,ybin,ybin_len,result); Display(result,result_len); long answer = ToDecimal(result,result_len); cout << " The answer is " << answer << endl;} int Convert( long x, char * a){ int i = 0 ; while ( ! (x < 2 )) { int residual = x % 2 ; a[i] = residual + 48 ; i ++ ; x = x / 2 ; } a[i] = x + 48 ; return i + 1 ;} void Display( char * a, int len){ for ( int i = len - 1 ;i >= 0 ;i -- ) cout << a[i]; cout << endl;} int Plus( char * x, int xlen, char * y, int ylen, char * result){ int i = 0 ,jw = 0 ; bool flag = 3 ; do { if (i >= xlen) x[i] = 48 ; if (i >= ylen) y[i] = 48 ; if (flag = (i >= xlen) && (i >= ylen) && (jw == 0 )) break ; int bw = x[i] - 48 + y[i] - 48 + jw; switch (bw) { case 0 : jw = 0 ; break ; case 1 : jw = 0 ; break ; case 2 : bw = 0 ; jw = 1 ; break ; case 3 : bw = 1 ; jw = 1 ; break ; } result[i] = bw + 48 ; i ++ ; } while ( 1 ); return i;} long ToDecimal( char * a, int len){ long d = 0 ; for ( int i = 0 ;i < len;i ++ ) d += (a[i] - 48 ) * ( int )pow( 2.0 ,i); return d;}