当前位置:首页 > 算法 > 正文内容

【算法】高精度(2)

亿万年的星光4年前 (2021-05-02)算法1541

五、高精度处理进位与借位

    其实也很简单,我们再来模拟一下,1439+887的时候,首先我们最低位相加,得到16,那么答案最低位就是6,再进个1,然后两数的十位相加,3+8=11,然后再加上进位的1,就是11+1=12,所以答案十位就是2,再进1,4+8+1=13,答案百位是3,进1,1+0+1=2,答案千位是2。所以结果就是6232!哦,不对反了,是2326,这里要注意一下,输出的时候是倒着输出的,千万不要忘了。

总结一下,进位的步骤大致如下:

1、将当前位置的数相加,当前位的结果就是当前结果除以10的余数。

2、再讲当前结果除以10加到高位,表示进位。

注意:有同学可能会有疑问,为什么一定要倒着储存这个数呢?顺着存不是更好吗?这里我举一个非常简单的例子,比如10+90,谁都知道答案是100,那么我们来看看顺着储存和倒着储存有什么区别:

1.顺着存:a={1,0},b={9,0},当a的最高位(即数组第1位)加上b的最高位(即数组第2位)时我们是不是得进位?!?但是a的最高位是数组的第一位,那么我们要进位到a数组的第几个位置呢?第0个位置?太复杂了。还是存在第一个位置并把所有的数往数组右边移动一位?那更不行,时间复杂度又太高,所以不好办。

2.倒着存:a={0,1},b={0,9},当a的最高位(即数组第2位)加上b的最高位(即数组第2位)时我们同样要进位,这个时候就好办了,直接进位到数组的第三位就好了,所以答案的数组就是{0,0,1},倒过来输出答案100。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//比较a和b的大小,如果a>b则返回真,否则返回假
int c[100];
void add(int a[],int b[])
{
        int i=1;x=0; //x是进位 
        c[i]=a[i]+b[i]+x;   //第i位相加并加上上次的进位 
        x=c[i]/10;   //向高位进位 
        c[i]%=10;  //存储第i位 
        i++;      //位置下标变量 
}


int a[6666],b[6666],c[6666];
int lena,lenb,lenc;
 
int main(){
    lenc=max(lena,lenb);
    for(int i=1;i<=lenc;i++){
        c[i]=c[i]+a[i]+b[i];
        c[i+1]=c[i]/10;
        c[i]=c[i]%10;
    }
    while(c[lenc+1]>0) lenc++;//答案的长度有时还会增加
}


接下来讲讲当减法的时候如何借位

1、将当前位置的数向减。

2、如果结果大于或等于0就直接作为当前位的答案。

3、否则将结果加10作为当前位的答案,在将高位的数-1即可。

1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

int a[6666],b[6666],c[6666];

int lena,lenb,lenc;

 

int main(){

    lenc=max(lena,lenb);

    for(int i=1;i<=lenc;i++){

        c[i]=c[i]+a[i]-b[i];

        if(c[i]<0) c[i]=c[i]+10,c[i+1]=-1;

    }

    while(c[lenc]==0&&lenc>1) lenc--;//细节,如果a-b结果为0,那么也要输出一个0

}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【算法】最小重量机器设计

【题目描述】设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设Wij 是 从供应商j处购得的部件i的重量,Cij 是相应的价格。 试设计一个算法,给出总价格不超...

【贪心】区间覆盖

【贪心】区间覆盖

【题目描述】给定一个长度为m的区间,再给出n条线段的起点和终点(本题考虑闭区间),求最少使用多少线段可以将整个区间完全覆盖。【输入】第一行是区间长度m。第二行是n,表示有n个可选区间。后面跟着n行数据...

【算法】高精度(1)

一、  什么是高精度高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算...

【二分】----基础用法

【二分】----基础用法

0.二分法简介二分法是一种查找算法要求:数据必须是有序序列核心思想:掐头去尾取中间1. 引入对于一个有序数组,如{1,3,6,8,23,56,78,99},如果我们要查找其中的一个数78的下标位置,按...

【算法】二分法—最大化平均值问题简单总结

0.前言通过几道题目 切割钢管、木材加工、切割绳子、均分蛋糕 四道题,尝试了二分法中最大化平均值问题。然后,下面进行简单的对比和总结。1.简单总结while(l < ...

【算法】前缀和与差分(2)一 一维数组差分

【算法】前缀和与差分(2)一 一维数组差分

一、差分:一维数组的差分可看作是一维数组前缀和的逆运算。二、差分数组首先给定一个原数组a:   a[1]、a[2]、a[3]、......然后构造一个数组b: b[1]、b[2]、...