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