【基础】1005 大数加法

版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/83759244

代码大部分是相同的,不是很简洁,原谅我是小白。

代码:

#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中的每一个元素,注意进位。

扫描二维码关注公众号,回复: 4003450 查看本文章

判断c数组最后一个元素正负确定输出的正负,并进行进位或退位操作。

最后记得输出的是abs(c[i]),c[i]的绝对值。考虑A=-111,B=-222,C中是-3-3-3,根据最后一个元素取正负,在取C中每个元素的绝对值。答案-333

猜你喜欢

转载自blog.csdn.net/qq_41138935/article/details/83759244
今日推荐