剑指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<<endl;

    delete[] temp1;
	delete[] temp2;
	 delete[] Sum;
 }
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:"<<endl;
	gets(number1);
	cout<<"please input a number:"<<endl;
	gets(number2);
	BigNumberPlus(number1,number2);
	
	cout<<"please input a number:"<<endl;
	gets(number1);
	cout<<"please input a number:"<<endl;
	gets(number2);
	BigNumberPlus(number1,number2);

	cout<<"please input a number:"<<endl;
	gets(number1);
	cout<<"please input a number:"<<endl;
	gets(number2);
	BigNumberPlus(number1,number2);

	system("pause()");
	return 0;
}
运行结果为:



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值