zoukankan      html  css  js  c++  java
  • 基础算法_高精度算法

    存储方式:

    • 使用字符串、数组存储
    • 从低位到高位依次存放, 即string[0] 存放个位

    创建: 将字符串转换成数组

        string x, y;
        vector<int> a, b;
        cin >> x >> y;
        for(int i = x.length() - 1; i >= 0; i--) a.push_back(x[i] - '0');
        for(int i = y.length() - 1; i >= 0; i--) b.push_back(y[i] - '0');
    

    输出函数

    void display(string s) {
        for(int i = s.length() - 1; i >= 0; i--)
            printf("%c", s[i]);
        puts("");
    }
    

    高精度加法: 两个大数相加

    思路:

    • 模拟列竖式加法,使用中间变量t,将t的个位上的数存入答案数组

    代码模板

    vector<int> add(vector<int> &a, vector<int> &b) {
        vector<int> ans;
        for(int i = 0, t = 0; i < a.size() || i < b.size(); i++) {
            if(i < a.size()) t += a[i];
            if(i < b.size()) t += b[i];
            ans.push_back(t % 10);
            t /= 10;
        }
        if(t) ans.push_back(1);
        return ans;
    }
    

    高精度减法: 两个大数相减

    思路:

    • 判断结果的正负,如果前者大于后者结果为正,否则计算后者减前者,再加上一个负号

    代码模板

    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;
    }
    
    vector<int> sub(vector<int> &a, vector<int> &b) {
        vector<int> ans;
        // 通过比较函数已经确定size(a) > size(b)
        for(int i = 0,t = 0; i < a.size(); i++) {
            t = a[i] - t; // 去掉前者的借位
            if(i < b.size()) t -= b[i];
            ans.push_back((t + 10) % 10);
            if(t < 0) t = 1; // 表示借位
            else t = 0;
        }
    
        while(ans.size() > 1 && ans.back() == 0) ans.pop_back();
    
        return ans;
    }
    

    高精度乘法 :一个很大的数乘以一个很小的数

    思路:

    • 借用一个中间变量t表示进位,t不为零或者未访问完a数组,循环就一直进行

    代码模板

    vector<int> mul(vector<int> &a, int b) {
        vector<int> ans;
        int t = 0;
        for(int i = 0; i < a.size() || t; i++) {
            if(i < a.size()) t += a[i] * b;
            ans.push_back(t % 10);
            t /= 10;
        }
        return ans;
    }
    

    高精度除法:一个很大的数除以一个很小的数,返回商和余数

    思路

    • 模拟列式手算除法, 从高位开始算起,每次将余数乘10,再加上下一位,将r整除b的结果存入答案数组。
    • 反转答案数组
    • 去掉前导零

    代码模板

    vector<int> div(vector<int> &a, int b, int &r) {
    	vector<int> ans;
    	r = 0;
    	// 模拟手算除法, 从高位算起
    	for(int i = a.size() - 1; i >= 0; i--) {
    		r = r * 10 + a[i];
    		ans.push_back(r / b);
    		r %= b;
    	}
    	// 按照存储方式,从低位开始存储
    	reverse(ans.begin(), ans.end());
    	// 去掉前导零
    	while(ans.size() > 1 && ans.back() == 0) ans.pop_back();
    	return ans;
    }
    
  • 相关阅读:
    C# 后台调用webApi
    WebApi传参详解
    网络爬虫字体解密
    单元测试的简单实用
    JQuery中$.ajax()方法参数详解
    vscode HTML标签换行问题
    C#基础之Assembly 当前项目的程序集GetAssemblies
    RedisHelper
    vue setTimeout 和 this.$nextTick,BMap api
    excel 导出 OpenXml
  • 原文地址:https://www.cnblogs.com/Hot-machine/p/13186485.html
Copyright © 2011-2022 走看看