#include<iostream>
#include<string.h>
using namespace std;
long long int change1(char *x)//把十六进制转换成十进制,返回值类型要long long int位数才够
{
char n[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
long long int s=0,l,e=1;//用s记录10进制的总和,l记录数组长度,e控制权位变化
int t=1,f=0,flag=1,p=0,i;//t控制正负,f记录符号个数,flag控制第一次权位为1,p记录不同位数上的数字或字母代表的十进制大小,i控制循环进行每个十六进制位数与十进制的对比判断
l=strlen(x);
if(x[0]=='-')
{
t=-1;
f++;
}
if(x[0]=='+')
f++;
while((l--)-f)//数组长度要减去符号长度,并且要从所给16进制的末尾开始
{
for(i=0;i<16;i++)
if(x[l]==n[i])
{
p=i;
break;
}
if(flag)
{
flag=0;
e=1;
}
else
e=e*16;
s=s+p*e;
}
s=s*t;
return s;
}
void change2(long long int x,char *s)//把十进制转换成十六进制
{
char n[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
long long int l=0,x1;
int t;
if(x<0)//小于0时先在数组储存好‘-’
{
s[l++]='-';
x=-x;
}
x1=x;
if(x1==0)//统计转换后的十六进制数需要的数组长度,若直接用x计算,会导致下一个判断错误
l=1;
else
{
while(x1)
{
x1=x1/16;
l++;
}
}
s[l--]='\0';//先在数组最后添加‘\0’
if(x==0)//先排除和为0的情况,因为和为0时while循环不进入
s[l]='0';
else
{
while(x)
{
t=x%16;
s[l--]=n[t];
x=x/16;
}
}
}
int main()
{
char a[20],b[20],ss[20];
long long int c,d,f;
while(cin>>a>>b)
{
c=change1(a);
d=change1(b);
f=c+d;
change2(f,ss);
cout<<ss<<endl;
}
return 0;
}
杭电ACM2057C++
最新推荐文章于 2019-11-17 09:38:36 发布