0
点赞
收藏
分享

微信扫一扫

高精度运算

Android开发指南 2022-03-30 阅读 82
c++

参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了。而要在普通运算原理的基础上,加以辅助算法来实现超大数据的计算。

主体思路是利用数组(或者字符串)模拟竖式运算的过程,对每一位单独进行运算,同时处理进位问题,得出答案。

多采取逆序存储的方式,因为在存储时我们首先能确定的就是最低位,所以设它为第一位,而高位无法确定,所以用大的下标存储高位。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str1, str2;
    int a[250]={0}, b[250]={0}, len;
    int i;
    cin >> str1 >> str2;        //输入两个字符串
    a[0] = str1.length();       //取得第一个字符串的长度,放在0下标处,仅为方便。
    for (i = 1; i <= a[0]; i++) //把第一个字符串转换为整数,存放在数组a中
        a[i] = str1[a[0] - i] - '0';//逆序存储在数组中。
    b[0] = str2.length();       //取得第二个字符串长度
    for (i = 1; i <= b[0]; i++) //把第二个字符串中的每一位转换为整数,存放在数组b中
        b[i] = str2[b[0] - i] - '0';//逆序存储在数组中。
    len = (a[0] > b[0] ? a[0] : b[0]); //取两个字符串最大的长度
    for (i = 1; i <= len; i++)         //做按位加法,同时处理进位
    {
        a[i] += b[i];          //两数相加
        a[i + 1] += a[i] / 10; //进行进位操作,进位值为a[i]/10,注意进位是高位的,因此我们要除以10
        a[i] %= 10;            //对相加后的数据进行模10操作,使其取值范围为0-9
    }
    len++; //去掉最高位的0,然后输出。
    while ((a[len] == 0) && (len > 1))
        len--;
    for (i = len; i >= 1; i--)
        cout << a[i];
    return 0;
}

 另一种使用二维数组实现多个数的高精度相加

#include <bits/stdc++.h>
using namespace std;
int n, f[5010][5010], len;
void gaojingjia(int k)
{
    for (int i = 1; i <= len; i++)
        f[k][i] = f[k - 1][i] + f[k - 2][i];
    for (int i = 1; i <= len; i++) //处理进位
        if (f[k][i] >= 10)
        {
            f[k][i + 1] += f[k][i] / 10;
            f[k][i] %= 10;
            if (f[k][len + 1] > 0)
                len++;
        }
}
int main()
{
    cin >> n;
    len = 1;
    f[1][1] = 1;                 //此题为斐波那契数列,由于数据较大使用高精加。
    f[2][1] = 2;                 
    for (int i = 3; i <= n; i++) //开始计算
        gaojingjia(i);
    for (int i = len; i >= 1; i--) //倒序输出
        cout << f[n][i];
    return 0;
}

其他高精度运算思路类似,不再过多举例。 

举报

相关推荐

0 条评论