csdn英雄会(pongo)题解之二十进制数的加法

10号EAST要开始通电准备实验了,所以比较忙,今天看到出新题,而且很简单,就敲了下代码。还有AB数和前两天的回文数没有写题解,打算这周末补上。

---------------------------------------------------分割线----------------------------------------------

题目详情:

在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。

输入是两个二十进制整数,且都大于0,不超过100位;

输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。


这道题很简单,就是由低位向高位依次相加,注意进位就好了。需要注意的地方是:最高位的进位别忘记插入到返回值中去,如jaa66+aa66=1010cc,别丢了最前面的那个进位1。

代码如下:

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class Test {
public:
    static string calculate (string   x,string   y)
    {
        
		int xSize=x.size();
		int ySize=y.size();

		std::string *xp=&x;
		std::string *yp=&y;
		int min=ySize;
		//确保xp指向xy中较长字符串,yp指向x、y中较短字符串
		if(xSize<ySize){
			xp=&y;
			yp=&x;
			min=xSize;
			xSize=ySize;
			ySize=min;
		}	
		int jw=0;
		int i=0;
		//对两个字符串的公共低位进行相加
		for(;i<min;++i){
			int xIndex=xSize-1-i;
			int yIndex=ySize-1-i;

			if(xp->at(xIndex)>=48&&xp->at(xIndex)<=57)
				xp->at(xIndex)-=48;
			else
				xp->at(xIndex)-=87;//97-10

			if(yp->at(yIndex)>=48&&yp->at(yIndex)<=57)
				yp->at(yIndex)-=48;
			else
				yp->at(yIndex)-=87;
			xp->at(xIndex)+=yp->at(yIndex)+jw;//
			jw=0;
			if(xp->at(xIndex)>=20){
				jw=1;
				xp->at(xIndex)-=20;
			}
			if(xp->at(xIndex)<10)
				xp->at(xIndex)+=48;
			else
				xp->at(xIndex)+=87;
		}
		//如果公共低位相加的结果存在向高位进位的话,对较长字符串的高位进行处理
		if(jw){
			for(;i<xSize;++i){
				int xIndex=xSize-1-i;
				if(xp->at(xIndex)=='9')xp->at(xIndex)='a';
				else if(xp->at(xIndex)=='j'){
					xp->at(xIndex)='0';
					continue;
				}else xp->at(xIndex)+=1;
				jw=0;
				break;
			}
			if(jw){//存在向更高位的进位的话,需要在较长的字符串开始处插入‘1’
				xp->insert(xp->begin(),'1');
			}
		}
		//返回较长的字符串
		return *xp;
    }
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{   
    std::cout<<(int)'a'<<std::endl;
	cout<<Test::calculate("jaa66","aa66")<<endl;   
} 
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。


你可能感兴趣的:(题解,英雄会,pongo,CSDN英雄会,二十进制数的加法)