剑指offer之面试题12 大数相加 实现任意两个整数的加法

剑指offer面试题12  打印从1到最大的n位10进制数 。陷阱在于  当输入的n很大时,不管用int 或 long long 都会溢出。这个代码 剑指offer源码上已经给出。于此相关的题目是 

定义一个函数,实现任意两个整数的加法,因为没有限定两个数的大小范围,所以也要当做大数问题处理,既用字符串表示。

代码如下:

void BigNumberPlus(char * number1,char* number2)
 {
	 char* Sum = new char[MAXSIZE +2];      //MAXSIZE 为宏定义 
	 int len1 = strlen(number1);
	 int len2 = strlen(number2);
	 int maxLen = len1 > len2 ?len1 :len2;
	 char* temp1 = new char[maxLen +1];
	 char* temp2 = new char[maxLen +1];
	 memset(temp1,'0',maxLen);               //初始化的过程已经补齐字符串
	 temp1[maxLen] = '\0';
	 memset(temp2,'0',maxLen);
	 temp2[maxLen] = '\0';
      int nSum = 0;
	  int isCarryBit = 0;
	  int isOverflow = 0;
	  int i=0,j =0;
	  //////////////////////反转字符串
       for (i = len1 -1;i>=0;i--)
       {
		   temp1[j++] = number1[i];
       }
	   temp1[j] = '\0';
	   j =0;
	   for (i = len2 -1;i>=0;i--)
	   {
		   temp2[j++] = number2[i];
	   }
      //////////////////////字符串相加,从低位到高位
	  for (i= 0; i< maxLen;i++)
	  {
		  nSum = temp1[i] -'0'+ temp2[i] - '0' + isCarryBit;
          //////是否有进位
		  if ( nSum >9)
          {
			  if (i == maxLen -1)
			  {
				  isOverflow = 1;    //是否溢出
			  }
			  isCarryBit = 1;
			  Sum[i] = nSum - 10 + '0';
          }
		  else
		  {
			  isCarryBit = 0;
              Sum[i] = '0' + nSum;
		  }
	  }
	  if (isOverflow)
	  {
		  Sum[maxLen++] = '0'+ isCarryBit;
	  }
	  Sum[maxLen] = '\0';
      ///////////////打印
	  for (i = maxLen -1;i>=0;i --)
	  {
		  cout << Sum[i];
	  }
	  cout<
main函数为:

int main()
{
	char* number1 = new char[MAXSIZE +1];
	char* number2 = new char[MAXSIZE +1];
	number1 = new char[MAXSIZE +1];
	number2 = new char[MAXSIZE +1];
	cout<<"please input a number:"<
运行结果为:

剑指offer之面试题12 大数相加 实现任意两个整数的加法_第1张图片

你可能感兴趣的:(剑指offer之面试题12 大数相加 实现任意两个整数的加法)