1. 程式人生 > >大數加法(包括負數)

大數加法(包括負數)

大數加法

多謝部落格大大的指點 :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過不了

還請各位大佬指教敲打