首页 > 编程语言 >(坚持每天写算法)基础算法复习与学习part1基础算法1-7——高精度减法(处理t=1和t>1代码的写法,t为操作次数)

(坚持每天写算法)基础算法复习与学习part1基础算法1-7——高精度减法(处理t=1和t>1代码的写法,t为操作次数)

时间:2024-01-13 17:34:59浏览次数:31  
标签:高精度 int back part1 算法 vector 减法 include size

  题目:

  思路:这一道题其实和高精度加法的思路是差不多的,都是使用算式进行模拟。

  重点:关于代码怎么写,在高精度加法那里还看不太出来(我也没有写),但是在高精度减法这里就完全可以看出来了。我们在加法算式里面,一般是A[i]+B[i]+t,但是也可以这么写:t+A[i]+B[i],我们可以先写进位,然后之后对进位t进行处理就行了,而在刚开始的时候我们只要将t设置成0就可以了,0没有进位为0,那么t+A[i]+B[i]就是通用的式子,所以高精度加法可以这么写: 

 vector<int> C;
 int t = 0 ;
 for(int i = 0 ; i < A.size() || i <B.size(); i ++){
     if(i < A.size()) t += A[i];
     if(i < B.size()) t += B[i];
     C.push_back(t % 10);
     t /= 10;
 }

  那么在高精度加法里面也可以是同个思路,我们一般是A[i]-B[i]-t,但是我们可以换成:A[i]-t-B[i],在刚开始我们将借位t设为0即可,而我们的借位是怎么来的呢?就是在每一轮中(A[i]-t-B[i])<0我们的t就会变换,所以我们的代码可以这么写:

vector<int> C;
int t = 0;
    
for(int i = 0 ; i < A.size() || i < B.size() ; i ++){
    t = A[i] - t;
    if(i < B.size() ) t -= B[i];
    C.push_back((t + 10) % 10 );
    if(t < 0) t = 1;
    else t = 0;//if-else是为了借位
}

  (注意,接下来一段由于没有图很难理解相当于自言自语,可以不用观看)

  在得出通用式子,或者想要想要获得通用情况的时候,往往需要处理第一次情况,在这个例子里面就是将t设置为0,类似的处理还有:如果第一次和之后的流程不一样,直接用if来特指第一种情况;如果某变量在整个过程都需要更新尤其需要在第一次赋值更新,那么使用for条件筛选掉第一次情况在for后面添加第一次情况即可。(很抽象,如果遇到了那种代码,这里还会更新的)

  在上面A[i]-t-B[i]的思路里,我们都是默认A大于B,如果是类似于5-23或者23-24这种就要将A和B的地位互换了,这里是图解:

   这里是代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>

using namespace std;

//虽然说本题目的减法借位可以做出来,但是我按照A.size() - B.size() 然后分别做出来的数不是一样的,只要位数太大了,那么我的代码就会失败
//所以反而是cmp函数需要注意
bool cmp(vector<int> &A, vector<int> &B)
{
    if (A.size() != B.size()) return A.size() > B.size();

    for (int i = A.size() - 1; i >= 0; i -- )
        if (A[i] != B[i])
            return A[i] > B[i];//从大比到小,看看是谁先绷不住

    return true;//等于的话也要true
}


vector<int> sub (vector<int>&A , vector<int>&B ){//别忘了地址符
    vector<int> C;
    int t = 0;

    for(int i = 0 ; i < A.size() || i < B.size() ; i ++){
        t = A[i] - t;
        if(i < B.size() ) t -= B[i];
        C.push_back((t + 10) % 10 );
        if(t < 0) t = 1;
        else t = 0;//if-else是为了借位
    }
    while(C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
int main(){
    string a , b;
    cin >> a >> b;

    vector<int> A , B;

    for(int i = a.size() - 1 ; i >= 0 ; i --) A.push_back(a[i] - '0');
    for(int i = b.size() - 1 ; i >= 0 ; i --) B.push_back(b[i] - '0');

    vector<int> C;


    if (cmp(A, B)) C = sub(A, B);
    else C = sub(B, A), cout << '-';

    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    cout << endl;
    return 0;

}

  补充:关于为什么要将A,B的数字反着存储这件事情,因为我们常见的数组(数据结构,vector也算)都是从左往右算(这里不考虑队列可以使用头插法),而算式是从右往左算,故将A,B的数字反着存储。

  时间复杂度:观察一下代码,发现还是取决于A的位数,核心代码只有一个循环,无递归,如果A的位数是n,那么时间复杂度就是O(n)。

  

标签:高精度,int,back,part1,算法,vector,减法,include,size
From: https://www.cnblogs.com/clina/p/17962646

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (170)-- 算法导论13.2 3题
    三、用go语言,设在图13-2左边一棵树中,a、b和c分别为子树a、β和γ中的任意结点。当结点x左旋之后,a、b和c的深度会如何变化?文心一言:在二叉树中,左旋操作是改变节点的子节点顺序。原本的子节点β变为新的左子节点,原本的左子节点γ变为新的右子节点。对于给定的节点a、b和c,我们首......
  • 文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题
    一、用go语言,写出RIGHT-ROTATE的伪代码。文心一言:在计算机科学中,右旋转(RIGHT-ROTATE)是一种常见的操作,通常用于数组或链表。以下是一个使用Go语言实现右旋转的伪代码:funcrightRotate(arr[]int,kint)[]int{n:=len(arr)k%=n//防止k大于n的情况rev......
  • 基于融合语义信息改进的内容推荐算法。Improved content recommendation algorithm in
    引言路漫漫其修远兮,吾将上下而求索。每天一篇论文,做更好的自己。本文读的这篇论文为发表于2023年5月28日的一篇名为《基于融合语义信息改进的内容推荐算法》(基于融合语义信息改进的内容推荐算法)的文章,文章主要介绍了基于内容的推荐技术在电子商务和教育领域的广泛应用,以及传统基......
  • 大数据分类算法深度解析
    博客:大数据分类算法深度解析1.背景大数据的快速增长带来了更多的机会和挑战。分类算法作为机器学习的基石之一,在处理大规模数据时变得尤为重要。其目标是根据已知的数据集,将新数据分配到预定义的类别中。2.特征提取与预处理在分类算法中,特征提取是非常关键的一步。特征是从原始数......
  • JVM7(GC 分代收集算法 VS 分区收集算法)
    1.分代收集算法当前主流VM垃圾收集都采用”分代收集”(GenerationalCollection)算法,这种算法会根据对象存活周期的不同将内存划分为几块,如JVM中的新生代、老年代、永久代,这样就可以根据各年代特点分别采用最适当的GC算法1.1.在新生代-复制算法每次垃圾收集都能发......
  • 秦九韶算法学习笔记
    快速求多项式——秦九韶算法计算\(\sum^n_i{a_i\timesx^i}\)的值。1.朴素算法算出每一项的值再相加,总共要进行\(\frac{n(n+1)}{2}\)次乘法,\(n\)次加法。2.秦九韶算法\(a_0+a_1x+a_2x^2+\dotsa_nx^n=(((a_nx+a_{n-1})x+a_{n-2}\dots)x+a_1)x......
  • [RFC6238] TOTP: 基于时间的一次性密码生成算法
    原创 给我馍馍 给我馍馍 2019-03-2822:42在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。 生活中我们会经常使用到TOTP的算法应用,如银行的动态口令器、网络游戏中的将军令、......
  • 文心一言 VS 讯飞星火 VS chatgpt (177)-- 算法导论13.3 6题
    六、用go语言,说明如果红黑树的表示中不提供父指针,应当如何有效地实现RB-INSERT。文心一言:红黑树是一种自平衡的二叉搜索树,其中每个节点都包含一个颜色属性(红色或黑色),并且满足以下性质:节点是红色或黑色。根节点是黑色。所有叶子节点(NIL或空节点)都是黑色。如果一个节点是红色的,则......
  • 【教3妹学编程-算法题】统计出现过一次的公共字符串
    3妹:哈哈哈哈哈哈,太搞笑了~呵呵呵呵呵呵2哥:3妹干嘛呢,笑的这么魔性!3妹:在看王牌对王牌,老搞笑了2哥:这季好像没有贾玲吧。3妹:是啊,听说贾玲去导电影了,还狂瘦了100斤呢,哎,我也该减减肥了。2哥:切,你每隔几天就会说要减肥,也没见你减啊3妹:不吃饱哪有力气减肥,我每天还要刷题、找工作,多辛苦啊......
  • AI烟火检测算法解决方案
    一、背景需求根据国家消防救援局公布的数据显示,2023年共接报处置各类警情213.8万起,督促整改风险隐患397万处。火灾危害巨大,必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题,无法有效发现险情降低火灾损失。利用智能分析网关V4烟火检测算法,可以及时准确地......