1. 程式人生 > >【基礎】1005 大數加法

【基礎】1005 大數加法

程式碼大部分是相同的,不是很簡潔,原諒我是小白。

程式碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

char ac[10005];
char bc[10005];
int arr[10005];
int brr[10005];
int crr[10005];

int add1(){
	int maxv=max(strlen(ac),strlen(bc));
	int t=0;
	for(int i=0;i<maxv+1;i++){
		crr[i]=arr[i]+brr[i]+t;
		if(crr[i]>=10){
			t=crr[i]/10;
			crr[i]=crr[i]%10;
		}else{
			t=0;
		}
	}
	if(crr[maxv]!=0)
		cout<<crr[maxv];
	for(int i=maxv-1;i>=0;i--){
		cout<<crr[i];
	}
	cout<<endl;
}
int sub2(){				//A負  B正 
	int flag=1;	//答案正負,1為正,0為負
	if(strlen(ac)-1>strlen(bc)) 
		flag=0;
	else if(strlen(ac)-1==strlen(bc)){
		int i;
		for(i=0;i<strlen(bc);i++){
			if(ac[i+1]>bc[i]){
				flag=0;
				break;
			}
			else if(ac[i+1]<bc[i]){
				flag=1;
				break;
			}
		}
		if(i>=strlen(bc)){
			cout<<0<<endl;
			return 0;
		}
			
	}else
		flag=1;
		
	if(flag){	//B大 
		for(int i=0;i<strlen(bc);i++){
			brr[i]-=arr[i];
			if(brr[i]<0){
				brr[i]+=10;
				brr[i+1]-=1;
			}	
		}
		int len=strlen(bc)-1;
		while(brr[len]==0)	len-=1;

		for(;len>=0;len--)
				cout<<brr[len];
	}else{		//A大 
		for(int i=0;i<strlen(ac)-1;i++){
			arr[i]-=brr[i];
			if(arr[i]<0){
				arr[i]+=10;
				arr[i+1]-=1;
			}	
		}
		int len=strlen(ac)-2;
		cout<<"-";
		while(arr[len]==0)	len-=1;
		for(;len>=0;len--)
				cout<<arr[len];
	}
}
int sub3(){		//A正 B 負  
	int flag=1;	//答案正負,1為正,0為負
	if(strlen(ac)>strlen(bc)-1) 
		flag=1;
	else if(strlen(ac)==strlen(bc)-1){
		int i;
		for(i=0;i<strlen(ac);i++){
			if(ac[i]>bc[i+1]){
				flag=1;
				break;
			}
			else if(ac[i]<bc[i+1]){
				flag=0;
				break;
			}
		}
		if(i==strlen(ac)){
			cout<<0<<endl;
			return 0;
		}
			
	}else
		flag=0;
	//
	if(flag){	//A大 
		for(int i=0;i<strlen(ac);i++){
			arr[i]-=brr[i];
			if(arr[i]<0){
				arr[i]+=10;
				arr[i+1]-=1;
			}	
		}
		int len=strlen(ac)-1;
		while(arr[len]==0)	len-=1;
		for(;len>=0;len--)
				cout<<arr[len];
	}else{		//B大 
		for(int i=0;i<strlen(bc)-1;i++){
			brr[i]-=arr[i];
			if(brr[i]<0){
				brr[i]+=10;
				brr[i+1]-=1;
			}	
		}
		cout<<"-";
		int len=strlen(bc)-2;
		while(brr[len]==0)	len-=1;
		for(;len>=0;len--)
				cout<<brr[len];
	}
}
int add4(){
	int maxv=max(strlen(ac),strlen(bc));
	int t=0;
	for(int i=0;i<maxv;i++){
		crr[i]=arr[i]+brr[i]+t;
		if(crr[i]>=10){
			t=crr[i]/10;
			crr[i]=crr[i]%10;
		}else{
			t=0;
		}
	}
	cout<<'-';
	if(crr[maxv-1]!=0)
		cout<<crr[maxv-1];
	for(int i=maxv-2;i>=0;i--){
		cout<<crr[i];
	}
	cout<<endl;
}
int main(){
	scanf("%s",ac);
	scanf("%s",bc);
	memset(arr,0,sizeof(arr));
	memset(brr,0,sizeof(brr));
	memset(crr,0,sizeof(crr));
	
	if(ac[0]!='-'&&bc[0]!='-'){		//A B都為正 
		int y=0;
		for(int i=strlen(ac)-1;i>=0;i--){	 
			arr[y++]=ac[i]-'0';
		}
		y=0;
		for(int i=strlen(bc)-1;i>=0;i--){
			brr[y++]=bc[i]-'0';
		}
		add1();
	}else if(ac[0]=='-'&&bc[0]!='-'){	//A負 B正 
		int y=0;
		for(int i=strlen(ac)-1;i>0;i--){	 
			arr[y++]=ac[i]-'0';
		}
		y=0;
		for(int i=strlen(bc)-1;i>=0;i--){
			brr[y++]=bc[i]-'0';
		}
		sub2(); 
	}else if(ac[0]!='-'&&bc[0]=='-'){	//A正 B負 
		int y=0;
		for(int i=strlen(ac)-1;i>=0;i--){	 
			arr[y++]=ac[i]-'0';
		}
		y=0;
		for(int i=strlen(bc)-1;i>0;i--){
			brr[y++]=bc[i]-'0';
		}
		sub3(); 
	}else{								//A B都為負 
		int y=0;
		for(int i=strlen(ac)-1;i>0;i--){	 
			arr[y++]=ac[i]-'0';
		}
		y=0;
		for(int i=strlen(bc)-1;i>0;i--){
			brr[y++]=bc[i]-'0';
		}
		add4();
	}	

	return 0;
} 

別人家的:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char aa[100010],bb[100010];
int a[100010],b[100010],c[100010];
int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	scanf("%s%s",aa,bb);
	int la=strlen(aa);
	int lb=strlen(bb);
 
	for(int i=la-1,j=0;i>0;i--)  //反轉字串(不包含 首個字元);
		a[j++]=aa[i]-'0';
 	if(aa[0]=='-')
	{
		for(int i=0;i<la-1;i++) //把 首字元 填入a[]陣列中;
 			a[i]=-a[i];
 	}
 	else
 		a[la-1]=aa[0]-'0';
 
 	for(int i=lb-1,j=0;i>0;i--)
 		b[j++]=bb[i]-'0';
	if(bb[0]=='-')
 	{
 		for(int i=0;i<lb-1;i++)
 			b[i]=-b[i];
 	}
 	else
 		b[lb-1]=bb[0]-'0';
 
 	int lc=max(la,lb);
	int p,r=0;
 	for(int i=0;i<lc;i++)
 	{
 		p=a[i]+b[i]+r;
 		r=p/10;
 		c[i]=p%10;
 	}
 	if(r)
 		c[lc++]=r;
 	while(lc>1&&c[lc-1]==0)  //略過 前面的0;
 		lc--;
 	int flag=0;
 
	if(c[lc-1]>=0)  //A,B相加為正;
 	{
 		flag=1;
 		for(int i=0;i<lc;i++)
 		{
 			while(c[i]<0)
 			{
				c[i+1]--;
 				c[i]+=10;
 			}
 		}
 	}
 	else
 	{
 		flag=-1;
		for(int i=0;i<lc;i++)
 		{
			while(c[i]>0)
 			{
 				c[i+1]++;
 				c[i]-=10;
 			}
 		}
 	}
 	if(flag<0)
 		printf("-");
 	while(lc>1&&c[lc-1]==0)
 		lc--;
 	for(int i=lc-1;i>=0;i--)
 		printf("%d",abs(c[i]));
  	printf("\n");
}

解析:

資料表示:

如果

A輸入為- 1 2 3 4 5,那麼在int a陣列中則用-5 -4 -3 -2 -1 0表示,

B輸入1 2 3 4 5,那麼在 int b陣列中則用 5 4 3 2 1 表示,

資料計算:

用陣列a+陣列b中的每一個元素,注意進位。

判斷c陣列最後一個元素正負確定輸出的正負,並進行進位或退位操作。

最後記得輸出的是abs(c[i]),c[i]的絕對值。考慮A=-111,B=-222,C中是-3-3-3,根據最後一個元素取正負,在取C中每個元素的絕對值。答案-333