51Nod 1005大数加法

6人阅读 评论(1) 收藏 举报
分类:
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例

537643802472

写了很久,唉,实力太弱了,主要是细节有点多。我先写了俩函数,一个是正数加法的,一个是正数减法的,然后就是判断情况,分为正正,负负,正负,负正。最后还有就是全0的情况,还有前面有零的情况。中间还写了一个判断俩字符串大小的函数,简单来说,就这些吧。我函数名字就是拼音,还是很好认的、晚安:附代码:
#include <bits/stdc++.h>
using namespace std; 

typedef long long int ll;
int jiafa(char *a,int lena,char *b, int lenb,char *c) 
{
	for(int i=0;i<lena;i++)a[i]=a[i]-'0';
	for(int j=0;j<lenb;j++)b[j]=b[j]-'0';
	int num;
	int flag=0;
	int k=0;
	for(int i=0;i<max(lena,lenb);i++)
	{
		num=a[i]+b[i]+flag;
		if(num>9)
		{
			c[k]=num-10;
			flag=1;
		}
		else {
			c[k]=num;
			flag=0;
		}
		k++;
	}
	if(flag==1)
	c[k++]=1;
	for(int i=0;i<k;i++)
	c[i]=c[i]+'0';
	return k;
}
int jianfa(char *a,int lena,char *b, int lenb,char *c) 
{
	for(int i=0;i<lena;i++)a[i]=a[i]-'0';
	for(int j=0;j<lenb;j++)b[j]=b[j]-'0';
	int flag=0;
	int k=0;
	int num;
	for(int i=0;i<lena;i++)
	{
		num=a[i]-b[i]-flag;
		if(num<0)
		{
			c[k]=num+10;
			flag=1;
		}
		else {
			c[k]=num;
			flag=0;
		}
		k++;
	}
	for(int i=0;i<k;i++)
	c[i]=c[i]+'0';
	return k;
}
int bijiao(char *a,int lena,char *b,int lenb)
{
	int flag=0;
	if(lena>lenb)
	flag=1;
	else if(lena==lenb)
	{
		for(int i=lena-1;i>=0;i--)
		{
			if(a[i]>b[i])
			{
				flag=1;
				break;
			}
			else {
				flag=0;
				break;
			}
		}
	}
	return flag;
}
int panling(char *a,int lena)
{
	int flag=0;
	for(int i=0;i<lena;i++)
	{
		if(a[i]!='0')
		{
			flag=1;
			break;
		}
	}
	return flag;
}
int chuling(char *a,int lena)
{
	
	for(int i=0;i<lena;i++)
	{
		if(a[i]=='0')
		{
			for(int j=i;j<lena;j++)
			{
				a[j]=a[j+1];
			}
			i--;
			lena--;
		}
		else break;
	}
	return lena;
}
int main()  
{  
    int n;
#ifdef LOCAL
	freopen("D:/input.txt", "r", stdin);
#endif
	char a[10500];
	char b[10500];
	char c[20500];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	scanf("%s",a);
	scanf("%s",b);
	int flaga=0, flagb=0;
	int lena=strlen(a);
	int lenb=strlen(b);
	if(a[0]=='-')flaga=1;
	if(b[0]=='-')flagb=1;
	int k;
	int flag=0;
	if(flaga==1&&flagb==1)
	{
		reverse(a+1,a+lena);
	 	reverse(b+1,b+lenb);
		k=jiafa(a+1,lena-1,b+1,lenb-1,c);
		flag=1;
	 } 
	 if(flaga==0&&flagb==0)
	 {
	 	reverse(a,a+lena);
	 	reverse(b,b+lenb);
	 	k=jiafa(a,lena,b,lenb,c);
	 }
	 if(flaga==0&&flagb==1)
	 {
	 	reverse(a,a+lena);
	 	reverse(b+1,b+lenb);
	 	if(bijiao(a,lena,b+1,lenb-1)==1)
	 	{
	 		k=jianfa(a,lena,b+1,lenb-1,c);
	 		
		 }
		 else {
		 	k=jianfa(b+1,lenb-1,a,lena,c);
		 	flag=1;
		 }
	 }
	 if(flaga==1&&flagb==0)
	 {
	 	reverse(a+1,a+lena);
	 	reverse(b,b+lenb);
	 	if(bijiao(a+1,lena-1,b,lenb)==1)
	 	{
	 		k=jianfa(a+1,lena-1 ,b,lenb,c);
	 		flag=1;
		 }
		 else {
		 	k=jianfa(b,lenb,a+1,lena-1,c);
		 	
		 }
	 }
	 reverse(c,c+k);
	 k=chuling(c,k);
	 if(panling(c,k)==0)
	 cout<<'0';
	 else {
	 	if(flag==1)
	 	cout<<'-';
	 	for(int i=0;i<k;i++)
		cout<<c[i];
	 }
    return 0;  
}  


查看评论

51Nod-1005-大数加法

今天遇见一道细节问题特别多的题,写得我眼疼,题本身不难,难得是他的细节问题繁多,需要考虑的情况也甚多,稍有不慎就侧漏了,哈哈。 题的思路也很清晰,就是将最后的结果的正负的符号分离出来,剩下的就是高精度...
  • f_zyj
  • f_zyj
  • 2016-04-15 03:39:44
  • 1061

51nod-1005 大数加法

给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度  Output 输出A + B Input 示例 689321...
  • u012773338
  • u012773338
  • 2014-12-07 18:46:11
  • 1047

【51nod】1005 大数加法

1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果。 Inpu...
  • ctsas
  • ctsas
  • 2016-12-09 18:01:32
  • 358

51nod 1005 大数加法 大数运算

大数运算 修改 隐藏话题 1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 ...
  • qq1319479809
  • qq1319479809
  • 2015-12-19 15:54:22
  • 1169

51nod 1005《《大数加法》》

1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的...
  • leibniz_zhang
  • leibniz_zhang
  • 2016-06-23 17:35:28
  • 576

51Nod 1005 大数加法

新手编程日记--刷题篇
  • guotch
  • guotch
  • 2017-04-22 10:47:07
  • 99

51nod 1005 大数加法(大数模板)

给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度  Output 输出A + B Input示例 6...
  • Jamence
  • Jamence
  • 2017-09-12 22:33:36
  • 83

51nod 1005 大数加法

给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度 ...
  • hello_sheep
  • hello_sheep
  • 2017-07-01 23:41:23
  • 116

51nod 1005 大数加法

51nod 1005 大数加法 心好累。。。#include #include #include #include #include #include #include #includ...
  • qq_33199236
  • qq_33199236
  • 2016-09-13 20:11:36
  • 173

51nod——1005 大数加法

题目链接:点击打开链接 题目: 给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度  Output 输出A + B Input示例 6893214...
  • hunt_er
  • hunt_er
  • 2017-11-29 23:10:24
  • 38
    个人资料
    等级:
    访问量: 1万+
    积分: 1010
    排名: 5万+
    最新评论