《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。

Posted Alex_996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。相关的知识,希望对你有一定的参考价值。

高精度加法。输入两个正整数,求它们的和。

算法分析

输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在C++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,这样我们方便写出两个整数相加的算法。
an……a3 a2 a1
bn……b3 b2 b1
+————————
cn……c3 c2 c1
我们用数组a、b分别存储加数和被加数,用数组c存储结果。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main ()

 char a1[100],b1[100];
 int a[100],b[100],c[100],lena,lenb,lenc,i,x;
 memset(a,0,sizeof(a));
 memset(b,0,sizeof(b));
 memset(c,0,sizeof(c));
 gets(a1);
 gets(b1);
 //输入加数和被加数
 lena=strlen(a1);
 lenb=strlen(b1);
 for(i=0;i<=lena-1;i++)
 //把加数放入a数组
  a[lena-i]=a1[i]-48;                     //思考:为什么要-48?
 
 for(i=0;i<=lenb-1;i++)
 //把加数放入b数组
  b[lenb-i]=b1[i]-48;                     //思考:为什么要-48?
 
 lenc=1;x=0;
 while(lenc<=lena||lenc<=lenb)
 
  c[lenc]=a[lenc]+b[lenc]+x;
  //两数相加
  x=c[lenc]/10;
  c[lenc]%=10;
  lenc++;
 
 c[lenc]=x;
 if(c[lenc]==0)
 //处理最高位
  lenc--;
 
 for(i=lenc;i>=1;i--)
 //输出结果
  cout<<c[i];
 
 cout<<endl;
 return 0;

升级版代码

#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main ()

	string a1,b1;
	bool temp=true;
	int a[100],b[100],c[100],lenc=1,x=0;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	cin>>a1>>b1;
	for(int i=0;i<=a1.length()-1;i++) a[a1.length()-i]=a1[i]-'0';
	for(int i=0;i<=b1.length()-1;i++) b[b1.length()-i]=b1[i]-'0';
	while(lenc<=a1.length()||lenc<=b1.length())
	
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	
	c[lenc]=x;
	for(int i=lenc;i>=1;i--)
	
		if(c[i]==0&&temp) continue;
		else temp=false;
		cout<<c[i];
	
	if(c[1]==0) cout<<0<<endl;
	cout<<endl;
	return 0;

以上是关于《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。的主要内容,如果未能解决你的问题,请参考以下文章

樱花(信息学奥赛一本通 1624)

信息奥赛一本通 1060:均值

[普通递推数列] 转自《信息学奥赛之数学一本通》

最大子矩阵(信息学奥赛一本通 1224)

完全背包问题 买书(信息学奥赛一本通)

数字转换 信息学奥赛一本通 树形dp