加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

高精度运算总结(让我慢慢更新10.16)

发布时间:2021-01-19 22:44:05 所属栏目:大数据 来源:网络整理
导读:首先抛出问题,给定两个几十万位的数,输出他们加减乘除的运算结果。 分析:对于这类问题,不要指望int double这些东西了,基本数据类型不可能存的下。我们可以把这两个数当成字符串输入到数组中,然后模拟手动的竖式运算(不会的话,回去上小学)得出结果。

首先抛出问题,给定两个几十万位的数,输出他们加减乘除的运算结果。

分析:对于这类问题,不要指望int double这些东西了,基本数据类型不可能存的下。我们可以把这两个数当成字符串输入到数组中,然后模拟手动的竖式运算(不会的话,回去上小学)得出结果。

应用:随便什么工程计算要求精确到小数点后十万位,或者运算数直接就有十万位,这些情况太常见了吧。貌似windows的计算器就是采用高精度运算,不信去试试。

暂定的写作顺序如下
整数加法(完事)
整数减法
整数乘法
整数除法
小数加法
小数减法
小数乘法
小数除法

整数加法

给定两个数989和9889来模拟一下大整数加法的实现过程(请先手动做一下竖式计算)

  1. 接收数据并预处理
char str_1[100];
    char str_2[100];
    memset(str_1,'',sizeof(str_1));//初始化字符串为空
    memset(str_2,sizeof(str_2));
    scanf("%s%s",str_1,str_2);//字符串形式接收两个数
    int len_1=strlen(str_1);
    int len_2=strlen(str_2);

    int num_1[100];//两个数倒序装入整型数组准备运算
    int num_2[100];//为什么要倒叙?为了给进位留足空间
    memset(num_1,0,sizeof(num_1));
    memset(num_2,sizeof(num_2));
    for(int i=0; i<len_1; i++)
        num_1[len_1-i-1]=str_1[i]-'0';
    for(int i=0; i<len_2; i++)
        num_2[len_2-i-1]=str_2[i]-'0';

为什么用字符串数组接收数据又转存到整型数组?
整型数组接收单个数字是以空格或者回车作为结束符,大整数的输入过程是没有空格或回车的。
字符串数组实际存储的是一个字符对应的Ascll码值,9+8其实是9对应的Ascll码和8对应的Ascll码相加得到新的Ascll码,结果肯定不是17,因为Ascll码表中只有0~9。

为什么要倒叙转存进整型数组?
要留足进位空间。假如是正序存入的(括号内写数组下标)
9(0)8(1)9(2)+
9(0)8(1)8(2)9(3)
我们该如何使得这两个数的个位对齐呢?就算个位对齐成这种样子
??????9(1)8(2)9(3)+
9(0)8(1)8(2)9(3)
得到的结果也会因为进位而无法存储
1(-1)0(0)8(1)7(2)8(3)??数组下标怎么可能为-1
如果我们是倒叙转存进整型数组的话,一切问题都可以迎刃而解
9(0)8(1)9(2)?+
9(0)8(1)8(2)9(3)
8(0)7(1)8(2)0(3)1(4)
不仅个位对齐,由于全部是倒叙,向右进位也可以很好的解决。

2.运算并处理进位

int num[100];//存储运算结果
    memset(num,sizeof(num));
    int len=max(len_1,len_2);//运算结果的长度
    for(int i=0; i<len; i++)
    {
        num[i]=num_1[i]+num_2[i]+num[i];//num[i]中可能存有前一位的进位
        if(num[i]>=10)//如果需要进位
        {
            num[i]=num[i]-10;
            num[i+1]++;//进位
        }
    }

3.去除前导零并输出

while(num[len]==0)//去除前导零
        len--;
    for(; len>=0; len--)
        printf("%d",num[len]);

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!