杭电oj2057《十六进制运算》,坑题,有知识盲点!

错误代码以及运行结果

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int a,b;
/*	while(cin>>hex>>a>>b)
	cout<<a+b<<endl;*/
	while(scanf("%x %x",&a,&b)!=EOF)
	   printf("%x\n",a+b);
	return 0;
} 

在这里插入图片描述
这里有两个错误

  1. 2c,其实答案应该为2C,为大写字母
  2. -1A-12 相加出现了莫名其妙的数,答案应该为-2C

错误原因
1、输出时要将16进制数的字母变成大写,默认是小写的。
2、计算机中不能直接显示16进制的负数,所以需要将负数转为正数输出。
3、注意使用__int64(这个没注意到。。什么时候才用__int64呢)
解决办法
1、字母变成大写,在c++中直接使用uppercase,作用为将输出的小写转换为大写,头文件是iomanip
2、16进制数的输出是以补码的形式进行的,负数的补码不可以直接输出(计算机组成原理)处理方法是先输出这个负数的绝对值,即一个正数,再在该正数的前面添加一个负号,得到想要的结果。
注:16进制输入c用%x c++用hex,加头文件iomanip
正确代码

#include<iomanip>
using namespace std;
int main(){
	__int64 a,b,sum;		
	while(cin>>hex>>a>>b){
		sum=a+b;
		if(sum<0){
			cout<<"-";
			cout<<hex<<uppercase<<-sum<<endl;
		}
		else
		    cout<<hex<<uppercase<<sum<<endl;
	}
	   
	return 0;
} 

刚开始用printf接收__int64 自己的编译器没出错但是结果不对,提交杭电后显示wrong改了cin后就好了。
用printf时要注意,应该用 %I64d接收。

发布了13 篇原创文章 · 获赞 0 · 访问量 202

猜你喜欢

转载自blog.csdn.net/weixin_45191675/article/details/104696699