首页 > 编程语言 >学不会的高精度算法

学不会的高精度算法

时间:2023-06-15 20:45:04浏览次数:48  
标签:std string 高精度 int length 算法 ans 不会

前言

在洛谷水题的时候发现本蒟蒻是连高精度都不会的蒟蒻中的蒟蒻,所以想要浅浅学习一下

什么是高精度算法

高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。「摘自百度百科」

高精度加法

利用字符串存储数字,再利用小学数学的基础,模拟两个数字的相加和进位,不足的位数用0补齐,要注意的是:最后的结果可能是较大数的位数 + 1

来一个洛谷的题目小小练习一下,点击传送门:P1601 A+B Problem(高精)
蒟蒻的代码如下

#include <iostream>
#define int long long
std::string add(std::string a,std::string b){
    std::string ans;
    int lena = a.length();
    int lenb = b.length();
    if(lena > lenb){//在数字前面补0
        for(int i = lenb;i < lena;i ++){
            b = '0' + b;
        }
    }else {
        for(int i = lena;i < lenb;i ++){
            a = '0' + a;
        }
    }
    int t;
    int left = 0;//进位
    for(int i = a.length() - 1;i >= 0;i --){
        t = a[i] + b[i] - 2 * '0' + left;
        ans = (char)(t % 10 + '0') + ans;
        left = t / 10;
    }
    if(left != 0){//最后需要进位
        ans = (char)('0' + left) + ans;
    }
    return ans;
}
signed main() {
    std::string a,b;
    std::cin>>a>>b;
    std::cout<<add(a,b)<<'\n';
    return 0;
}

高精度减法

减法的运算相较于加法还是复杂一点点,但也只是一点点。减法主要有两种情况,大减小或者小减大。所以,需要判断结果的符号,但是计算都是一样的,用绝对值大的数减去绝对值小的数。考虑清楚之后,就又是利用小学数学的基础,模拟两个数相减和借位。
老规则来个传送门:P2142 高精度减法
蒟蒻的代码如下相当丑陋且水平低下

#include <iostream>
#define int long long
std::string div(std::string a,std::string b){
    std::string ans;
    std::string real;
    if(a == b){//如果a,b相等,结果为0
        return "0";
    }
    bool flag = true;//判断是正数还是负数
    if((a < b && a.length() == b.length()) || a.length() < b.length()) {
        flag = false;
        std::string t = a;//保证a是绝对值大的数
        a = b;
        b = t;
    }
    int lena = a.length();
    int lenb = b.length();
    if(lena > lenb){//在数字前面补0
        for(int i = lenb;i < lena;i ++){
            b = '0' + b;
        }
    }else {
        for (int i = lena; i < lenb; i++) {
            a = '0' + a;
        }
    }
    int t;
    int need = 0;//借位
    for(int i = a.length() - 1;i >= 0;i --){
        t = a[i] - b[i] - need;
        need = 0;
        while (t < 0){
            t += 10;
            need ++;
        }
        ans = (char) (t + '0') + ans;
    }
    if(!flag){
        ans = '-' + ans;
    }
    bool zero = true;//去除前导0
    for(int i = 0;i < ans.length();i ++){
        if(ans[i] != '0'){
            zero = false;
        }
        if(!zero){
            real += ans[i];
        }
    }
    return real;
}
signed main() {
    std::string a,b;
    std::cin>>a>>b;
    std::cout<<div(a,b)<<'\n';
    return 0;
}

阿巴阿巴

Q:为什么没有高精度乘法和除法?
A:下次再来填坑再不预习要挂科啦

标签:std,string,高精度,int,length,算法,ans,不会
From: https://www.cnblogs.com/clearTea/p/17483845.html

相关文章

  • 算法——树(二)
    1、路径总和给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回true;否则,返回false。1classSolution{2booleanhaspath=false;3p......
  • 【学习笔记】Primal-Dual 原始对偶算法
    Johnson全源最短路算法Floyd可以\(O(n^3)\)处理全源最短路,Bellman-Ford单源最短路的复杂度是\(O(nm)\)的,Dijkstra可以做到\(O(m\logm)\)但不能处理负边权,所以Johnson全源最短路算法通过处理使得可以用\(n\)次Dijkstra解决有负权图的全源最短路。先建超级源点,向......
  • Word 2016 不会响应WindowBeforeRightClick事件的Bug问题
    c#-WindowBeforeRightClickdoesn'twork-StackOverflow这是在Word2016的2016年3月更新中修复的错误。MS16-029:Word2016安全更新说明:2016年3月8日https://support.microsoft.com/en-us/kb/3114855......
  • 学不会的动态规划
    前言小蒟蒻在某次牛客中奖后,开始学习白嫖的动态规划课程。众所周知,动态规划的学习不是一朝一夕可以完成的,小蒟蒻将持续不定期更新大概率是长期拖更。如果文章中有任何问题,欢迎评论告诉我......
  • 算法练习-day8
    字符串28.找出字符串中第一个匹配项的下标题意:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例:    思路:本题有两种思路:1.暴力求解法,只需要一次遍历,以i为haystack字......
  • 算法——树(一)
    1、中序遍历递归classSolution{List<Integer>ans=newArrayList<>();publicList<Integer>inorderTraversal(TreeNoderoot){inorder(root);returnans;}publicvoidinorder(TreeNoderoot){if(root!=nul......
  • 数据结构(python版)—— 2、前期知识与算法分析
    从C转到python(一)C:helloWorld!#include<stdio.h>​intmain(){//sayhelloprintf("HelloWorld!\n")}1-Compile编译到机器码2-Link与各种库链接3-Execute执行目标程序Python:HelloWorld!defmain():#sayhelloprint("HelloWorld!"......
  • 力扣上任务调度相关的算法
    目录应用应用1:Leetcode1834.单线程CPU题目分析代码实现应用2:Leetcode621.任务调度器题目分析代码实现应用应用1:Leetcode1834.单线程CPU题目1834.单线程CPU给你一个二维数组tasks,用于表示n项从0到n-1编号的任务。其中\(tasks[i]=[enqueueTime_i,proc......
  • 优化算法——人工蜂群算法(ABC)
    一、人工蜂群算法的介绍  人工蜂群算法(ArtificialBeeColony,ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群......
  • 简单易学的机器学习算法——岭回归(Ridge Regression)
    一、一般线性回归遇到的问题  在处理复杂的数据的回归问题时,普通的线性回归会遇到一些问题,主要表现在:预测精度:这里要处理好这样一对为题,即样本的数量和特征的数量时,最小二乘回归会有较小的方差时,容易产生过拟合时,最小二乘回归得不到有意义的结果模型的解释能力:如果模型中的特征......