杭电oj1002 《大数相加》 气的肝儿疼的一道题

大数相加,通过字符数组或字符串存储数字进行运算。
采用分治法,分别取每一位运算同时设置进位标记,从后向前两个字符串最后一位以及进位相加。最后全部加完若有进位在字符串前加1

#include<iostream>
#include<string> 
using namespace std;
//刚开始命名为plus一直AC,这点要注意 
string xiangjia(string,string);
int main(){
	int T;
	cin>>T;
	string num1,num2,temp;//temp用来交换 
	int count=0;//用来记录样例个数 	
 while(T--){ 
 	cin>>num1>>num2;
 	string sum="";
	count++;
	sum=xiangjia(num1,num2);
	cout<<"Case "<<count<<":"<<endl;
	cout<<num1<<" "<<"+"<<" "<<num2<<" "<<"="<<" "; 
	for(int i=0;i<sum.size();i++){
		cout<<sum[i]-'0';
	}
	cout<<endl;
	//若不是最后一个样例 则再输出一个空行  
	if(T)cout<<endl;  		
	}
	
 return 0;	
} 

string xiangjia(string n1,string n2){
	//使n1的长度要比n2的大,方便做循环
	if(n2.size()>n1.size()){
	    string temp=n2;
		n2=n1;
		n1=temp;
	}
 int length1=n1.size();
 int length2=n2.size();
 int flag=0;//用来记录进位
 int a,b;/*a b始终指向两个字符串的最后一个字符 然后相加*/
 while(length1>0){//从数字大的开始循环
  int sum1=0;/*sum1只是用来存z字符相加值 并不是最后结果*/
  a=n1[length1-1]-'0';/*把字符串的最后一个数字表示出来*/
  if(length2>0)//因为length2短 会先结束 
  b=n2[length2-1]-'0';
  else b=0;
  sum1=a+b+flag;
  //把两个字符串最后一位还有进位相加
  //然后产生进位,取个位数,再转换成字符形式
  //就是结果字符串的最后一位
  
  if(sum1>=10){
  	flag=1;//进位标记变成1 
  	n1[length1-1]=sum1%10+'0';
  }
  else{
  	flag=0;
  	n1[length1-1]=sum1+'0';
  }
 //两个字符串向前走 
 length1--;
 length2--;		
 }//while循环结束 
 /*当循环结束,即字符串的第一个字符相加结束时*/
 //也可能会产生进位
 if(flag){
 	n1="1"+n1;//在前面加1 
 }
return n1;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值