十六进制大数加法

问题描述:编写程序,从键盘读入形如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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值