首页 > 编程语言 >大数的高精度算法

大数的高精度算法

时间:2023-01-03 17:48:43浏览次数:37  
标签:begin end string 高精度 int 大数 算法 length reverse

高精度加法:

#include <bits/stdc++.h>
using namespace std;

string add(string &a,string &b){
    string c;
    int t=0;
    if(a.length()<b.length()) return add(b,a);
    for(int i=0;i<a.length()||t;i++){
        if(i<a.length())t+=a[i]-'0';
        if(i<b.length()) t+=b[i]-'0';
         c += ((t % 10) + '0');
        t=t/10;
    }
     reverse(c.begin(),c.end());
    return c;
}

int main(){
    string a,b;
    int len;
    cin>>a>>b;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    string c=add(a,b);
    cout<<c;
}

 

高精度减法:

#include<bits/stdc++.h>

using namespace std;

bool cmp(string a,string b){
    if(a.length()!=b.length()) return a.length()>b.length();
    for(int i=0;i<a.length();i++)
        if(a[i]!=b[i]) return a[i]>b[i];

    return true;
}

string sub(string a,string b){
    string c;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    for(int i=0,t=0;i<a.length();i++){
      t=(a[i]-'0')-t;
      if(i<b.length()) t-=(b[i]-'0');
      c+=((t+10)%10+'0');
      if(t>=0) t=0;
        else t=1;
    }
    while(c.length()>1&&c.back()=='0') c.pop_back();
    reverse(c.begin(),c.end());
    return c;
}

int main(){
    ios::sync_with_stdio(false);

    string a,b;
    cin>>a>>b;
    if(cmp(a,b)) cout<<sub(a,b);
    else cout<<"-"<<sub(b,a);
    return 0;
}

高精度乘法:

#include<bits/stdc++.h>
using namespace std;

string mul(string a, int b){
  reverse(a.begin(),a.end());
  string c;
  int t=0;
  for(int i=0;i<a.length()||t;i++){
      if(i<a.length()) t+=(a[i]-'0')*b;
      c+=((t%10)+'0');
      t=t/10;
  }
  while(c.length()>1&&c.back()=='0') c.pop_back();
  reverse(c.begin(),c.end());
  return c;
}

int main(){
    string a;
    int b;
    cin>>a>>b;
    cout<<mul(a,b);
}

  

高精度除法:

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

string div(string &a,int b,int &r){
    string c;
    for(int i=0;i<a.length();i++){
        r=r*10+(a[i]-'0');
        c+=((r/b)+'0');
        r=r%b;
    }
    return c;
}

int main(){
    string a,c;
    int b,r=0,i=0;
    cin>>a>>b;
    c=div(a,b,r);
    if(c.length()==1) cout<<c;
    else{while(c[i]=='0') i++;
    if(i>=c.length()) cout<<'0';
    else{for(int j=i;j<c.length();j++)
    cout<<c[j];
    }
    }
    cout<<endl<<r;
}

 

标签:begin,end,string,高精度,int,大数,算法,length,reverse
From: https://www.cnblogs.com/yitongtianxia666/p/17022944.html

相关文章

  • KMP算法
    KMP算法参考:如何更好地理解和掌握KMP算法?模式串匹配算法,在一个主串(文本串s)中查找子串(模式串p)第一次匹配的位置算法两个关键操作根据模式串建立next数组根据next......
  • 算法竞赛进阶指南 0x43 线段树
    文章目录​​线段树简介​​​​线段树的简单代码实现​​​​建树代码​​​​修改操作​​​​查询操作​​​​线段树的查询操作的时间复杂度分析:​​​​[AcWing245.你......
  • 美颜sdk磨皮算法与人脸皮肤识别技术
    在之前的文章中小编曾提起过,美颜sdk以及其它美颜工具的核心技术都是人脸关键点识别,只有先识别人脸关键点才能进行后续的美颜操作。今天小编要讲的美颜sdk磨皮算法同样不例外......
  • 小程序 SHA1加密算法使用
    创建一个js文件,或写入util.js中//SHA1加密functionencodeUTF8(s){vari,r=[],c,x;for(i=0;i<s.length;i++)if((c=s.charCodeAt(i))<0x80)r.pu......
  • 排序算法
    选择排序选择排序(Selectionsort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续......
  • 每日算法之把二叉树打印成多行
    JZ78把二叉树打印成多行题目给定一个节点数为n二叉树,要求从上到下按层打印二叉树的val值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中......
  • 工程师应该学点算法——图论2
    为什么QQ要给女朋友推送前女友?这还是从图的算法说起。前篇->​​图论1​​图的遍历在图的遍历中我们一定要掌握两种最基础的算法:深度优先和广度优先。深度优先遍历(DFS)这......
  • 算法刷题 Day 6 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之
    哈希表理论基础建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set和map。什么时候想到用哈希法,当我们遇到了要快速判断一个元素是......
  • 算法基础之全排列(递归)
    全排列(递归)全排列就是从第一个数字起每个数字分别与他后面的数进行交换。去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。全排列(不去重)//搜索/......
  • 【Leetcode】天堂硅谷·数字经济算法编程大赛(虚拟)
    感受题目清单​​​https://leetcode.cn/contest/hhrc2022/​​周末比较忙,两场比赛都没有参加,打的虚拟赛。题解A.化学反应实验室内有一些化学反应物,其中的任意两种反应物......