题目:http://acm.hdu.edu.cn/showproblem.php?pid=2057
第一种方法:很普通,就是十六进制与十进制之间的转换,但要注意数的范围,开始用int ,然后又用long,就是完美避过了long long,
一个long long卡了我几天,好痛苦,但是当我知道第二种方法的时候更痛苦。本来几行的代码硬是让我写了100多行。其实本来就该适应这种被代码虐的感觉。*~* *~*
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
int pow(long x,long y)
{
long m=1;
for(long i=0; i<y; i++)
m*=x;
return(m);
}
int main()
{
string a,b;
long long a1,b1,flag,suma,sumb,sum,sumz;
char c[6]= {'A','B','C','D','E','F'};
long long d[6],k;
string love;
while(cin>>a>>b)
{
for(int i=0; i<6; i++)
d[i]=i+10;
suma=0;
sumb=0;
for(int i=0; i<a.length(); i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
for(int j=0; j<6; j++)
if(a[i]==c[j])
{
suma+=(d[j]*pow(16,a.length()-i-1));
//cout<<d[j]*pow(16,d[j]*a.length()-i-1)<<endl;
}
}
else if(a[i]-'0'>=0&&a[i]-'0'<=9)
{
suma+=((a[i]-'0')*pow(16,a.length()-i-1));
// cout<<(a[i]-'0')*pow(16,a.length()-i-1)<<endl;
}
//cout<<suma<<endl;
//else continue;
}
for(int i=0; i<b.length(); i++)
{
if(b[i]>='A'&&b[i]<='Z')
{
for(int j=0; j<6; j++)
if(b[i]==c[j])
{
sumb+=(d[j]*pow(16,b.length()-i-1));
// cout<<d[j]*pow(16,b.length()-i-1)<<endl;
}
}
if(b[i]-'0'>=0&&b[i]-'0'<=9)
{
sumb+=((b[i]-'0')*pow(16,b.length()-i-1));
//cout<<(b[i]-'0')*pow(16,b.length()-i-1)<<endl;
}
//else continue;
}
if(a[0]=='-')
suma=-suma;
if(b[0]=='-')
sumb=-sumb;
sum=suma+sumb;
//cout<<sum<<endl;
k=0;
if(sum<0)
sumz=-sum;
else sumz=sum;
while(sumz/16)
{
if(sumz%16>9)
{
for(int i=0; i<6; i++)
if(sumz%16==d[i])
love[k]=c[i];
//cout<<love[k]<<endl;
}
else love[k]=sumz%16+'0';
k++;
sumz/=16;
}
if(sum<0)
cout<<'-';
if(sumz%16>9)
{
for(int i=0; i<6; i++)
if(sumz%16==d[i])
cout<<c[i];
}
else cout<<sumz%16;
for(int i=k-1; i>=0; i--)
cout<<love[i];
cout<<endl;
}
return 0;
}
第二种方法:十六进制可以直接相加,,还有这种操作,,长见识了…………
%I64X :输出【无符号】十六进制数, 用大写字母 ,也就是说 %I64X 的格式【无法输出负数的】,但运算结果是有负数的。
一种简单的方法就是,把负数取绝对值,然后手工添加一个负号,
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
long long a,b,sum;
while(~scanf("%I64X %I64X",&a,&b))
{
//cout<<a<<b<<endl;
sum=a+b;
if(sum>=0)
printf("%I64X\n",sum);
else printf("-%I64X\n",-sum);
}
return 0;
}