高精度

高精度运算

问题:a和b都很大,不能直接存储,long long 都不行=.=

心算:把一个数一位一位拆开,根据数位进行运算。
原则: 倒着存数 ,倒着输出,方便运算。

1).加法运算
从数组第一个数依次按位相加, 满10进1位
a.输入、保存
for(i=0;i<s. length() ;i++)a[s.length()-i]=int(s[i]-"0");
for(i=0;i<s.length();i++)b[s1.length()-i]=int(s[i]-"0");、
//将数的最小位放在数组第一位,最高位放在数组最后位
例如:358410放入数组是014853
b.累加、进位
c[i+1]=c[i]/10; //十进制除以10,八进制除以8
c[i]=c[i]%10;
c[i]=c[i]+a[i]+b[i];
或者可以这么写:
if(c.num[i]>=10)
{
c.num[i+1]++;
c.num[i]-=10;
}
c.倒序输出、处理0
从数组末尾开始查找,找到第一个不是0的数就停下来
while(c[c1]==0&&c1>1)c1--;
for(i=c1;i>=1;i--)cout<<c[i];

2).减法运算
第一步和第三步参照1),主要是相减和借位。
首先要判断a和b大小:
if(s1.size()<s2. size() ||(s1.size()==s2.size()&&s1[i++]<s2[i++])) //length和size作用一样
//先比较长度,长度相等就比较每一位的大小
{
cout<<'-';
s3=s1;
s1=s2;
s2=s3; //交换被减数和减数
}
或者
if(choose(a,b)) //choose函数判断a,b大小,a<b return 1,else return 0
{
cout<<"-";
sub(b,a);
}
else sub(a,b);
然后进行 借位相减
for(i=1;i<=len;i++)
{
c[i]=c[i]+a[i]-b[i];
if(c[i]<0)
{
c[i]+=10;
c[i+1]--;
}
}

3).乘法运算
a、 高精度乘单精度
for(int i=1;i<=s.size();i++)
{
c[i]+=a[i]*b;
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
for(i=s.size()+1;c[i]>9;i++)
{
c[i+1]=c[i]/10;
c[i]%=10;
}
b、高精度乘高精度
for(int i=1;i<=s1.size();i++)
{
int x=0;
for(int j=1;j<=s2.size();j++)
{
c[i+j-1]=c[i+j-1]+a[i]*b[j]+x;
x=c[i+j-1]/10;
c[i+j-1]=c[i+j-1]%10;
}
c[i+s1.size()]=x; //最后的进位
int s=s1.size()+s2.size();
然后把1)的c1换成s。

万进制的高精度
每个元素存4位(0-9999逢万进)效率最高
读入:73 2937 2234
a[1]=2234,a[2]=2937,a[3]=73

4).除法运算
模拟竖式 :每次用剩下的数去除除数
用a(数组)存储被除数、b(数组)存储除数、x存储剩下的数。
for(int i=1;i<=n;i++)
{
x=x*10+a[i];
a[i]=x/b;
x=x%b;
}
注意:从最高位开始存储,前导零必须去掉!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值