题目:给你两个十六进制数字的加法或减法计算式,把他们转化成二进制,并输出十进制结果。
分析:模拟、字符串。十六进制和十进制是c语言内置的数据类型,可以直接应用,不过没有二进制。
所以,二进制要自己转化。
方法一:可以利用16进制读取数据(%x),然后,转化成二进制,可直16进制计算10进制输出。
方法二:可以利用字符串读入16进制数据,转化成10进制,然后再转化成二进制。
因为转化成二进制,如果是负数,存在补码转化问题,所以这里采用方案二。
注意:负数二进制要用补码的方式表示。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
char c,A[5],B[5];
int temp[20];
void to2( int a )
{
int flag = 0;
if ( a < 0 ) {
a = -a;
flag = 1;
}
for ( int i = 0 ; i <= 12 ; ++ i )
temp[i] = 0;
int count = 0;
while ( a ) {
temp[count ++] = a%2;
a /= 2;
}
if ( flag ) {
for ( int i = 0 ; i <= 12 ; ++ i )
temp[i] = !temp[i];
temp[0] ++;
for ( int i = 0 ; i <= 12 ; ++ i )
if ( temp[i] == 2 ) {
temp[i] = 0;
temp[i+1] ++;
}
}
count = 12;
while ( count >= 0 )
printf("%d",temp[count --]);
return;
}
int ctoi( char a )
{
if ( a >= '0' && a <= '9' )
return a-'0';
if ( a >= 'A' && a <= 'Z' )
return a-'A'+10;
if ( a >= 'a' && a <= 'z' )
return a-'a'+10;
}
int to10( char *A )
{
int i = 0,flag = 1,number = 0;
if ( A[0] == '-' ) {
flag = -1;
i = 1;
}
for ( ; A[i] ; ++ i ) {
number *= 16;
number += ctoi(A[i]);
}
return flag*number;
}
int main()
{
int n,a,b;
while ( cin >> n )
while ( n -- ) {
cin >> A >> c >> B;
a = to10(A);
to2(a);
printf(" %c ",c);
b = to10(B);
to2(b);
if ( c == '+' )
printf(" = %d\n",a+b);
else printf(" = %d\n",a-b);
}
return 0;
}