高精度算法,加减乘除

    xiaoxiao2021-03-25  92

    高精度算法的两个基本问题:高精度数的表示和高精度数的基本运算 1.高精度数的表示: 首先我想到的是do while 循环逆序存放在数组之中,但书中用string接受并且将其转化成数字,存放在数组之中

    int arr[100]; string str; cin >> str; int len = str.length(); for(int i=0;i<n;i++) { arr[i]=str[n-i-1]-'0'; }

    有了上面的操作前提,我们可以对其进行简单的操作 2.高精度数的基本运算:

    (1) 高精度数的加法: 算法思想:加法考虑到进位问题,如何存放进位的数组,由于存放在数组之中是按数字各位数依次排序,所以存在进位情况,只需在下标下一个直接加上进位值即可;

    //前提:两个非负数整型按上述顺序存放在数组a,和数组b中 for(int i=0;i<max(num1,num2);i++) { //num1,num2分别代表两个相加数的位数 a[i]=a[i]+b[i]; if(a[i]>9) {//处理进位情况 a[i]=a[i]-10; a[i+1]++;//下个权位加上进位值 } }

    (2) 高精度的减法 算法思想:两个非负数整型a,b,先考虑a>b的情况,倘若对应的相减时,被减数的该位数值不足以被减数该位值相减,需要向高位减数,对应数组操作便是数组对应值自减;而 a < b的情况只需求出b-a的值,取负即可;

    //前提:比较大数存放咋a数组之中,小数存放在b数组之中 for(int i=0;i<num;i++) { //num是较大数的位数 if(a[i]>=b[i]) //无进位情况 a[i]=a[i]-b[i]; else { a[i]=a[i]+10-b[i];//向高位借数 a[i+1]--;//高位值自减 } }

    (3)高精度乘法依赖于高精度加法: 算法思想:将乘数和被乘数的对应权位值对应值相乘,依次存放的第三个数组之中,对应下标累加权位指数相同者,结束后只需值第三个数组进行依次的进位操作即可 举列:256*378 256可以表示为:200(权位值为2)+50(1)+6(0) 378表示为:300(2)+70(1)+8(0) 存入数组后为:256:a[0]=6,a[1]=5,a[2]=2 378:b[0]=8,b[1]=7,b[2]=3 组合权位得:c[0]存放6*8 c[1]=6*7+5*8 c[2]=5*7+6*3+2*8 c[3]=5*3+2*7 c[4]=2*3 验算:256*378=96768 数组相加得:6*8+(6*7+5*8)*10+(5*7+6*3+2*8)*100+(5*3+2*7)*1000+(2*3)*10000 = 96768 成立 (4)高精度乘法 ==================坑============================

    转载请注明原文地址: https://ju.6miu.com/read-15950.html

    最新回复(0)