题目链接
大数相加,主要小心几点;
1.数据前导0
2.输出格式(巨奇怪)
我的思路:
俩个数相加,我们可以把长的作为模板,然后把短的数不断从低位往高位加,注意进位,至于如果相加多出最长的一位,前边只要加个1,因为就算是9+9也只进1。
伪代码(整理思路)
输入A,B;
把最长的赋值给A
把A,B前边的0去掉;
把B每一位加到A上;
输出;
AC代码:1+‘0’会变成字符1,‘1’-‘0’会变成数字1
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int real(string &a)//函数,去前边0,必须用&取址符,否则不会改变真实值
{
int len=a.size();
while(1&&len>1)//全是0也要把最后一位留下
{
len--;
if(a[0]=='0')
a.erase(0,1);//S.erase(a,b),意思从a位开始的b个数删去
else
break;//一旦不是,就不用删了
}
}
int main()
{
int n;
cin>>n;
for(int p=1;p<=n;p++)
{
string a,b,c,d;//由于题目要求输出格式,我们动了ab,之后用其他存起来
cin>>a>>b;
c=a;
d=b;
real(a);//引用函数去前导0
real(b);
int l1=a.size(),l2=b.size();
if(l2>l1)
{
swap(a,b);
swap(l1,l2);
}//如果B比A长,交换,保证A是最长的
bool f=false;//标记,看看是不是要在最前面加1
while(l2>0)//l2要>0才能加上去
{
int temp=a[l1-1]-'0'+b[l2-1]-'0',p=l1;//temp为末尾之和,大于10,进位
if(temp<10)//小于10,直接赋值
a[l1-1]=temp+'0';
while(temp>=10)
{
a[p-1]=temp-10+'0';
if(p-2>=0)//判断前方是不是还有数字
temp=(a[p-2]-'0')+1;
else//如果要进位,但是前面没数字了,进1
{
f=true;
break;
}
p--;
if(temp<10)
a[p-1]=temp+'0';
}
l2--;//最后一位加完了,A,B,都要向前进1位,相当于把长度减去1
l1--;
}
//输出了,除了最后一行1次外,其他都要换行2次,
cout<<"Case "<<p<<":"<<endl;
if(f)
cout<<c<<" + "<<d<<" = "<<1;
else
cout<<c<<" + "<<d<<" = ";
if(p!=n)
cout<<a<<endl<<endl;
else
cout<<a<<endl;
}
return 0;
}