问题描述:编写程序,从键盘读入形如X + Y=的表达式计算结果,其中X和Y都是合法且长度不超过64位的十六进制非负整数,结果中所有字符均大写且无多余的零。
样例1:输入 1234+1234=输出0X2468
样例2:输入 0000+12A= 输出0X12A
样例3:输入 12ff+1= 输出 0X1300
由于我们看到最长长度为64位,所以我们无法使用将十六进制数转化为十进制整型再相加的方法,所以便想到了用字符数组存储数的方法。
#include<stdio.h>
#include<string.h>
void ReverseString(char *s){//逆序数组使两数对齐
int i=0,j=strlen(s)-1;
char r;
while(i<j){
r=s[i];
s[i]=s[j];
s[j]=r;
i++;j--;
}
}
void Add(char* A,char *B,char *c){
char a[700],b[700];
strcpy(a,A);
strcpy(b,B);
int carry=0;//进位的值
int lena=strlen(a),lenb=strlen(b),lenc=0;
int i,sum=0;//每一位上的和
for(i=0;i<lena&&i<lenb;i++){
sum=carry;//将上一位的进位的值赋值到当前位
if(a[i]>='A'&&a[i]<='F'||a[i]>='a'&&a[i]<='f'){//考虑大小写
if(a[i]>='A'&&a[i]<='F')
sum=sum+a[i]-'A'+10;
else
sum=sum+a[i]-'a'+10;
}
else
sum=sum+a[i]-'0';
if(b[i]>='A'&&b[i]<='F'||b[i]>='a'&&b[i]<='f'){
if(b[i]>='A'&&b[i]<='F')
sum=sum+b[i]-'A'+10;
else
sum=sum+b[i]-'a'+10;
}
else
sum=sum+b[i]-'0';
carry=sum/16;
sum=sum%16;
if(sum<10){
c[lenc++]=sum+'0';
}
else{
c[lenc++]=sum-10+'A';
}
}
while(i<lena){
sum=carry;
if(a[i]>='A'&&a[i]<='F'||a[i]>='a'&&a[i]<='f'){
if(a[i]>='A'&&a[i]<='F')
sum=sum+a[i]-'A'+10;
else
sum=sum+a[i]-'a'+10;
}
else{
sum=sum+(a[i]-'0');
}
carry=sum/16;
sum=sum%16;
if(sum<10){
c[lenc++]=sum+'0';
}
else{
c[lenc++]=sum-10+'A';
}
i++;
}
while(i<lenb){
sum=carry;
if(b[i]>='A'&&b[i]<='F'||b[i]>='a'&&b[i]<='f'){
if(b[i]>='A'&&b[i]<='F')
sum=sum+b[i]-'A'+10;
else
sum=sum+b[i]-'a'+10;
}
else{
sum=sum+(b[i]-'0');
}
carry=sum/16;
sum=sum%16;
if(sum<10){
c[lenc++]=sum+'0';
}
else{
c[lenc++]=sum-10+'A';
}
i++;
}
if(carry!=0){
if(carry<10){
c[lenc++]=carry+'0';
}
else{
c[lenc++]=carry-10+'A';
}
}
while(c[lenc-1]=='0'){// 除去多余的零
lenc--;
}
c[lenc]='\0';
ReverseString(c);
}
int main(void){
char a[7000],b[7000],c[7000],ch;
int i=0;
ch=getchar();
while(ch!='+'){
a[i]=ch;
i++;
ch=getchar();
}
a[i]='\0';
i=0;
ch=getchar();
while(ch!='='){
b[i]=ch;
i++;
ch=getchar();
}
b[i]='\0';
ReverseString(a);
ReverseString(b);
Add(a,b,c);
printf("0X%s",c);
}