高精度加(减)法
Dev.C++高精度加法:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。
先贴代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000],b[1000],c[1000],l1,l2,l;
char x[1000],y[1000];
int main(){
gets(x);
gets(y);
l1=strlen(x);
for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
l2=strlen(y);
for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;
l=max(l1,l2);
for(int i=1;i<=l;i++){
n=a[i]+b[i]+m;
m=c[i]/10;
c[i]=n%10;
m=m+n;
if(m<10)m=0;
else{
m=1;
c[i+1]++;
}
}
if(m)l++;
for(int i=l;i>=1;i--)cout<<c[i];
}
意义:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。
使用:既然用整形装不下,那就用数组!因为字符数组输入时是一个字符一个字符的输入,所以用字符数组输入。
运算部分用整形数组还是字符数组都无所谓了,只不过字符数组要调整的地方可能比较多,
所以这里转换成整形数组-- -- -- -- -- -- -- -- -- -- -- -- --
for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;
-- -- -- -- --与此同时获取他们的数位-- -- -- -- -- -- -- -- -- -
l1=strlen(x);
l2=strlen(y);
l=max(l1,l2);
接下来是重点的计算部分(顺着代码讲,贴!)
for(int i=1;i<=l;i++){
n=a[i]+b[i]+m;
m=c[i]/10;
c[i]=n%10;
m=m+n;
if(m<10)m=0;
else{
m=1;
c[i+1]++;
}
}
if(m)l++;
- n:暂时性储存并计算第i位
- m:暂时清0
- c[i]:将n的数值存入输出数组中
- n%10{
假设n<10
此时n÷10=0,余数是它本身。把它赋进去就ok
当n≥10时
n÷10=1,余数是它本身减去10.
所以把n%10赋进去就ok
} - m:测试进位问题{
当m<10时,这一位莫得进位,可以安心算下一位了
当m≥10时,这一位有进位,要进行整理。首先,将下一位加一个一(这是因为当它是最后一位时,最后一位进位了,
但是l不到那里,所以循环已经结束了,不会进行进位运算。平常的情况,c数组等于一时,后来回直接变成n而不是加等于,所以这一点不用担心),
然后,将m+1(下一次运算中会将m算入进位计算中,还能起到标记作用)就ok了.
} - if(m)l++:在m≠0时,他是要进位的。但是如果到了最后一位,因为l是固定的,所以要进行数组扩容,将进位的地方也输出出来
倒序输出:我们是正序计算的(也可以倒序计算,那么输入输出就是正序的),因为计算是从小位算到大位,而输入输出是从大位开始的,
所以两者顺序要反
一下。
—————————————————————————————————————————————————————————————————————