位置:海口童程童美少儿编程培训学院 > 学校动态 > 学信息学 高精度的两个数字相加
计算机较初、也是重要的应用就是数值运算。我们知道,C/C++中的int类型能表示的范围是-231到231–1。unsigned类型能表示的范围是 0到232–1,即0-4294967295。所以,int和unsigned类型变量,都不能保存超过10 位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面 100位(比如求π的值),那么,即便使用能表示的很大数值范围的 double 变量,但是由于double变量只有 64位,所以还是不可能达到到小数点后面 100 位这样的精度。double 变量的精度也不足以表示一个 100 位的整数。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的思想就是用数组存放和表示大整数。一个数组元素,存放大整数中的一位。
那么,如何解决类似大整数这样的高精度计算问题呢?首先要处理好数据的接收和存储问题,其次要处理好运算过程中的“进位”和“借位”问题。比如,一个较简单的例子,给定两个不超过 200 位的整数,求他们的和。 高精度数制处理时采用模拟算法对位数达到百位甚至更多位数的数字进行各种运算,包括加法、减法、乘法、除法等基础运算。
【例1】阶乘之和,也就是N!的值。
【例2】高精度加法
输入两个1000位以内的正整数,输出他们的和。
问题分析:用字符串的方式读入两个高精度数,转存到两个整型数组a和b中,模拟加法的过程,从低位(第0位)开始对应位a[i]和b[i]相加,同时处理进位,结果存储到另一个数组c中,较后,从高位到低位输出c[i]。
#include
using namespace std;
char sa[1010],sb[1010];
int la,lb,lc,a[1010],b[1010],c[1010];
int main()
{
scanf("%s",sa);
scanf("%s",sb);
la=strlen(sa);
lb=strlen(sb);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i
{
a[la-i-1]=sa[i]-'0';//读入的字符串转为数字存储
}
for(int i=0;i
{
b[lb-i-1]=sb[i]-'0';
}
lc=la>lb?la:lb;
memset(c,0,sizeof(c));
for(int i=0;i
{
c[i]=a[i]+b[i]+c[i];//对应位相加,包括上一次运算产生的进位
if(c[i]>=10){
c[i+1]=1;
c[i]-=10;
}
}
if(c[lc]>0) //处理较高位的进位
lc++;
for(int i=lc-1;i>=0;i--)
printf("%d",c[i]);
return 0;
}
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/963/news/421428/违者必究! 以上就是海口童程童美少儿编程培训学院 小编为您整理 学信息学 高精度的两个数字相加的全部内容。