我们知道,目前计算机计算数值的精度较高,但因硬件限制,往往达不到实际生产需要,因此我们可以通过对程序进行缜密设计实现高精度计算。今天我们来谈谈这个问题。
首先,我们应知道,高精度计算的工作原理:
像竖式一样,我们可以利用竖式的进位、借位,再通过字符串存储数据与字符串函数的操作、计算,实现高精度计算。
Eg.
5 2 2 a3 a2 a1
+ 6 2 3 + b3 b2 b1
____________________ =====> _________________________
1 1 4 5 c4 c3 c2 c1
那么,在高精度计算时,我们应注意什么?
这就说来话长了······
1.数据的接收与存储
当输入数据很长很长······(如:1000位,10000位,10000000...位时),我们只要开出足够的字符串长度,利用字符串函数的操作、计算,将每一位取出,存入数组中。
1 void init(int a[]) { /*传入数组*/ 2 3 string s; 4 5 cin>>s; 6 7 a[0]=s.length(); /*用a[0]计算字符串s的位数*/ 8 9 for (i=1;i<=a[0];i++) 10 a[i]=s[a[0]-i]-‘0‘; 11 /*s----->a[],并倒序*/ 12 13 }
另一种是直接用循环加数组方法,也是异曲同工之妙。
2.确定高精度数位数
位数的确定:接收时往往是使用字符串,所以它的位数==字符串长度。
3.进位、退位
1 /*加法进位*/ 2 c[i]=a[i]+b[i]; 3 if (c[i]>=10) { 4 5 c[i]%=10; 6 ++c[i+1]; 7 8 } 9 10 /*减法进位*/ 11 if (a[i]<b[i]) { 12 13 --a[i]; 14 a[i]+=10; 15 16 } 17 18 c[i]=a[i]-b[i]; 19 20 /*乘法进位*/ 21 c[i+j-1]=a[i]*b[j]+x+c[i+i-1]; 22 x=c[i+j-1]/10; 23 c[i+j-1]%=10;
以上就是高精度计算的理论知识,以后我将会发放相关事例。
谢谢!
时间: 2024-10-22 14:35:51