Hdu 1002 A+B Problem Ⅱ

在这里插入图片描述
题目链接
大数相加,主要小心几点;
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;
}

差不多就这样

发布了9 篇原创文章 · 获赞 0 · 访问量 212

猜你喜欢

转载自blog.csdn.net/qq_45773977/article/details/104921539
今日推荐