#C++初学记录(高精度运算)(加法)

高精度运算
不管是int还是double亦或者long long ,这些定义变量都有数据范围的一定限制,在计算位数超过十几位的数,也就是超过他们自身的数据范围时,不能采用现有类型进行计算,只能自己通过编写程序进行计算也就是高精度运算。
程序代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char a1[205],b1[205];//数组用来存储两个相加的数 
	int a[205],b[205],c[205],lena,lenb,lenc=1,i,x=0;
	memset(a,0,sizeof(a));//对字符串初始化 
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	gets(a1);
	gets(b1);
	lena=strlen(a1);//将数组长度赋值给len 
	lenb=strlen(b1);
	for(i=0;i<lena;i++)
	a[lena-i]=a1[i]-'0';//将字符串通过ASCALL值转化为整形变量 
	for(i=0;i<lenb;i++)
	b[lenb-i]=b1[i]-'0';//通过倒序使数组两端的值互换 
	while(lenc<=lena||lenc<=lenb)
	{
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x;
	while(c[lenc]==0)//最高位的0要舍弃 
	{
		lenc--;
	}
	for(i=lenc;i>=1;i--)
	{
		cout<<c[i];
	}
	cout<<endl;
	return 0;
}

需要注意的地方
当一个输入的数据超过定义变量所支持的数据范围时(比如400位的数,一亿是9位数),用数组的方法更容易求所需求的的数据,用数组的一个空间来当作数的位数,即个位十位百位。这样用一个数组来储存一个数据,支持计算的数据范围更大,也简单易懂。
代码解读
memset() 函数常用于内存空间初始化,在代码的开头,我使用了memset()对数组进行初始化,即对数组a,b,c全部赋值为0。注意不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。在数组的创建之后,数组内剩余的空间会出现野值,若不清零,则在函数进行运算时会出现乱码。由于数组类型定义时是字符型,所以需要写一段代码进行转化,使之变为整形变量,使用高精度计算,数据的存入也有特殊方法,即倒序存入,通常开头第一个数据输入值是表示整个数据的长度,比如八位数据,则键入8。之后的数据从最高位到最低位一个一个排开单个键入。

posted @ 2019-03-21 20:24  十魇  阅读(599)  评论(0编辑  收藏  举报
GenerateContentList