大数加法(包括负数)

大数加法

多谢博客大大的指点 :https://blog.csdn.net/u012773338/article/details/41789401

大数加法,其实就是每个数的加法,C++的代码好长啊,不过仔细看还是有规律的,上代码

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
	char x[100010],y[100010];//以字符型输入大数x,y 
	int a[100010]={0},b[100010]={0};//用来将大数放入int  a,b 初始化为0 
	int size1,size2,size,flag1=0,flag2=0;//分别存x,y的长度,flag1,flag2用来判断x,y的正负 
	cin>>x>>y;
	size1=strlen(x);size2=strlen(y);
	if(x[0]=='-')//x 为负数
	{
		flag1=1; 
		for(int i=0;i<size1-1;i++)//除负号外倒叙存放在a[]中 
		a[i]=x[size1-1-i]-'0';
	}
	else//x 正数 
	{
		for(int i=0;i<size1;i++)
		a[i]=x[size1-1-i]-'0';
	}
	if(y[0]=='-')//y 负数 
	{
		flag2=1;
		for(int i=0;i<size2-1;i++)//除负号外倒叙存放b[]中 
		b[i]=y[size2-1-i]-'0';
	}
	else //y 正数 
	{
		for(int i=0;i<size2;i++)
		b[i]=y[size2-1-i]-'0';
	}
	
	if(flag1==0 && flag2==0)//x,y都为正 
	{
		size=max(size1,size2);//找出里面长度最大值 
		for(int i=0;i<size;i++)//对应 位 相加 
		{
			a[i]+=b[i];
			if(a[i]>=10)//大于10进一 
			{
				a[i]-=10;
				a[i+1]++;
			 } 
		}
		for(int i=size;i>=0;i--)//倒叙输出即为所求 
		{
			if(i==size&&a[i]!=0)//判断最高位是否进一 
			cout<<a[i];
			if(i!=size)
			cout<<a[i];
		}
		cout<<endl;
	}
	if(flag1==1 && flag2==1)//x ,y 负 
	{
		size=(size1-1,size2-1);
		for(int i=0;i<size;i++)
		{
			a[i]+=b[i];
			if(a[i]>=10)
			{
				a[i]-=10;
				a[i+1]++; 
			}
		}
		cout<<"-";//提前输出“-”号 
		for(int i=size;i>=0;i--)
		{
			if(i==size&&a[i]!=0)
			cout<<a[i];
			if(i!=size)
			cout<<a[i];
		}
		cout<<endl;
	}
	if(flag1==0 && flag2==1)//x正,y负
	{
		size=max(size1,size2-1);
	   int flagBig=0;//用来判断大小 
	   if(size1<size2-1)
	   flagBig=1;
	   else
	   {
	   	  if(size1==size2-1)
	   	  {
	   	  	for(int i=size;i>=0;i--)
	   	  	  {
	   	  	  	if(a[i]<b[i])
	   	  	  	  {
					flagBig=1;
					break;
				   }
			  }
			 }
		}
		
		if(flagBig==1)//y负数大 
		{
		  for(int i=0;i<size;i++)
		  {
		  	b[i]-=a[i];
		  	if(b[i]<0)//高位借一 
		  	 {
		  	 	b[i]+=10;
		  	 	b[i+1]--;  
			   }
		   }
		   cout<<"-"; 
		   for(int i=size-1;i>=0;i--)
		   {
		   	 if(i==size-1&&b[i]!=0)
		   	 cout<<b[i];
		   	 if(i!=size-1)
		   	 cout<<b[i];
		    }
			cout<<endl;	
		}
		else//x正大或相等 
		{
			for(int i=0;i<size;i++)
			{
			
			 a[i]-=b[i];
			 if(a[i]<0)
			 {
			 	a[i]+=10;
				a[i+1]--; 
			 }
		    }
			 for(int i=size-1;i>=0;i--)//一正一负的情况下最高位不可能进一,最高位为size-1 
			 {
			 	if(i==size-1&&a[i]!=0)
			 	cout<<a[i];
			 	if(i!=size-1)
			 	cout<<a[i];
			 }
			 cout<<endl;
		}
		
    }
    if(flag1==1 &&flag2==0)//x负,y正 
	{
		int flagBig=0;
		size=max(size1-1,size2);
		if(size1-1>size2)
		flagBig=1;
		else
		{
			if(size1-1==size2)
			{
				for(int i=size;i>=0;i--)
				{
					if(a[i]>b[i])
					{
						flagBig=1;
						break;
					}
				}
			}
	    }
		 if(flagBig==1)//x负大 
		 {
		 	for(int i=0;i<size;i++)
		 	{
		 		a[i]-=b[i];
		 		if(a[i]<0)
		 		{
		 			a[i]+=10;
		 			a[i+1]--;
				 }
			 }
			 cout<<"-";
			 for(int i=size-1;i>=0;i--)
			 {
			 	if(i!=size-1)
			 	cout<<a[i];
			 	if(i==size-1&& a[i]!=0)
			 	cout<<a[i];
			 }
			 cout<<endl;
           }
        else//y正大或相等 
        {
          for(int i=0;i<size;i++)
		  {
		  	b[i]-=a[i];
		  	if(b[i]<0)
		  	{
		  		b[i]+=10;
				b[i+1]--; 
			  }
		  }
		  for(int i=size-1;i>=0;i--)
		  {
		  	if(i!=size-1)
		  	cout<<b[i];
		  	if(i==size-1&& b[i]!=0)
		  	cout<<b[i];
		  }
		  cout<<endl;
		}
	}
	return 0;
}

应该是能看懂的,觉得已经很好理解了

但有一个问题   51nod 里面 1005过不了

还请各位大佬指教敲打

猜你喜欢

转载自blog.csdn.net/qq_41722217/article/details/80525524
今日推荐