高精度数主要指超出标准数据类型所能表示的数,比如两个200位数相加减。
而处理高精度数可以使用数组存储,然后再进行计算。
一、高精度数的存储
将数字反向存储在数组中,即数字的个位数存储在数组下标为0处,依次类推。
for(i=0;i<s.length;i++){
num[i]=s[s.length-n-i]-'0';
}
c语言:
char s1[50];
c1=s1;
scanf("%s",c1);
int n=strlen(c1);
int i=0;
for(i=0;i<n;i++){
num1[i]=*(c1+n-1-i)-'0';
}
二、高精度加法
类似于实际加减法,>9进位。
add(int num1[],int num2[]){
n1=strlen(num1),n2=strlen(num2);
for(i=0;i<(n1>n2?n1:n2);i++){
num1[i]=num1[i]+num2[i];//诸位相加
if(num1[i]>9){//进位处理
num1[i]-=10;
num1[i+1]+=1;
}}}
三、高精度减法
x-y,如果x>y,则直接相减。否则,xy互换,相加后的结果取负值即可。
类似于实际减法,不够减借位。
sub(int num1[],int num2[]){
for(i=0;i<(n1>n2?n1:n2);i++){
num1[i]=num1[i]-num2[i];
if(num1[i]<0){
num1[i+1]-=1;
num1[i]+=10;
}}}
四、高精度乘法
LA位的num1 乘以LB位的num2,得到的结果最低LA+LB-1位,如LA+LB-1位有进位,则最高有LA+LB位。
和实际的乘法类似。先累加到一个数组中,最后进行进位。
mul(int num1[],int num2[]){
for(i=0;i<=LA-1;i++){
for(j=0;j<=LB-1;j++){
c[i+j]+=num1[i]*num2[j];
}
}
for(i=0;i<LA+LB;i++){
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}}
五、高精度除法
用减法实现。如果num1<num2,商为0,余数为num1.否则,计算num1与num2的位数差,如12345 与 12,位数差为3,则12345-12*10的3次方*1 ,商+=1000;345与12 位数差1,345-12*10的1次方*2 ,商+=20,105与12的位数差为1,105-12*10的0次方*8,商+=8,所以商为1028,余数为9。