高精度运算(加减乘除)

在程序中高精度加法和高精度减法的运算本质是模拟我们在小学就学过的运算规则,也是我们平时用的运算规则:相加大于10就进1,相减小于就向高位借.

高精度加法

//高精度加法
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
//a,b字符串用于存入两个大数
std::string a, b;
//m,n分别逆序存入a,b
std::vector <int> m, n, p;
//la,lb用于记录a,b的位数
int la, lb;

void highPrecisionAddition() {
	int sum = 0;
	for (int i = 0; i < la || i < lb; i++) {
		if (i < la) {
			sum += m[i];
		}
		if (i < lb) {
			sum += n[i];
		}
		p.push_back(sum % 10);
		sum /= 10;
	}
	if (sum) {
		p.push_back(sum);
	}
}

int main() {
	//以字符串形式存放
	std::cin >> a;
	std::cin >> b;
	la = a.size();
	lb = b.size();
	//将字符串按位逆序存入数组m, n
	for (int i = la - 1; i >= 0; i--) {
		m.push_back(a[i] - '0');
	}
	for (int i = lb - 1; i >= 0; i--) {
		n.push_back(b[i] - '0');
	}
	highPrecisionAddition();
	reverse(p.begin(), p.end());
	for (auto i : p) {
		std::cout << i;
	}
	return 0;
}

高精度减法

//高精度减法
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

std::string a, b;
std::vector <int> m, n, p;
int la, lb;

bool cmp() {
    if (la != lb) {
        return la > lb;
    }
    for (int i = la - 1; i >= 0; i--) {
        if (m[i] != n[i]) {
            return m[i] > n[i];
        }
    }
    return true;
} 


void highPrecisionSubtraction(std::vector <int> &m, std::vector <int> &n) {
    int sub = 0;
    for (int i = 0; i < la || i < lb; i++) {
        sub = m[i];
        if (i < lb) {
            sub -= n[i];
        }
        if (sub < 0) {
            m[i + 1]--;
            sub += 10;
        }
        p.push_back(sub);
    }
    //去除前面多余的零,保证输出时前面不出现零
    while (p.size() > 1 && !p.back()) {
        p.pop_back();
    }
}


int main () {
    std::cin >> a;
    std::cin >> b;
    
    la = a.size();
    lb = b.size();

    for (int i = la - 1; i >= 0; i--) {
        m.push_back(a[i] - '0');
    }
    for (int i = lb - 1; i >= 0; i--) {
        n.push_back(b[i] - '0');
    }

    //如果输入是小减大则需要输出负号
    if (!cmp()) {
        //保证highPrecisionSubtraction里是大减小
        std::swap(m, n);
        std::cout << "-";
    }

    highPrecisionSubtraction(m, n);

    reverse(p.begin(), p.end());
    for (auto i : p) {
        std::cout << i;
    }
    return 0;
}

高精度乘法 在程序中的高精度乘法也与我们平时的运算差不多,略有不同. 高精度乘法

//高精度乘法
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
std::string a, b;
std::vector <int> m, n;
int la, lb;

void highPrecisionMultiplication(std::vector <int>& p) {
    for (int i = 0; i < la; i++) {
        for (int j = 0; j < lb; j++) {
            p[i + j] += m[i] * n[j];
            p[i + j + 1] += p[i + j] / 10;
            p[i + j] %= 10;
        }
    }
    while (p.size() > 1 && !p.back()) {
        p.pop_back();
    }
}

int main() {
    std::cin >> a;
    std::cin >> b;

    la = a.size();
    lb = b.size();
    std::vector <int> p(la + lb);

    for (int i = la - 1; i >= 0; i--) {
        m.push_back(a[i] - '0');
    }
    for (int i = lb - 1; i >= 0; i--) {
        n.push_back(b[i] - '0');
    }

    highPrecisionMultiplication(p);

    std::reverse(p.begin(), p.end());
    for (auto i : p) {
        std::cout << i;
    }
    return 0;
}


高精度除法 高精度除法的被除数为大数,而除数相对较小在整型范围内 运算规则同平时在纸上所列的计算方法

#include <iostream>
#include <string>
#include <vector>

std::string a;
int n;
std::vector <int> m, p;
int la, lb;

void highPrecisionDivision() {
    long long r = 0;
    for (int i = la - 1; i >= 0; i--) {
        r = r * 10 + m[i];
        p.push_back(r / n);
        r %= n;
    }
    while (p.size() > 1 && !p.back()) {
        p.pop_back();
    }
}

int main () {
    std::cin >> a;
    std::cin >> n;
    la = a.size();

    for (int i = la - 1; i >= 0; i--) {
        m.push_back(a[i] - '0');
    }

    highPrecisionDivision();

    for (auto i : p) {
        std::cout << i;
    }
    return 0;
}

更新于 2024/10/22

评论

评论 0

暂无评论
全部文章
music

521755ldsdl.jpg

关于

QAQ

C++离散化

为什么要离散化处理? 数据过于多时难以表示数组下标 离散化是什么? 可以类比哈希表 离散化就像哈

教程超详细xcpc滚榜教程

首先需要导出比赛的表格 1.处理表格 最终效果如下图 自行添加的列有id,judged,solv

C++快速幂

快速幂 用于快速求a^b的算法 思想:拆分 例:求2^13 等价于求 2^1 * 2^4 * 2

C++高精度运算(加减乘除)

在程序中高精度加法和高精度减法的运算本质是模拟我们在小学就学过的运算规则,也是我们平时用的运算规

C++素数筛法(埃氏筛法、线性筛法)

素数筛法:用于筛选出素数 核心思想:用一个数筛选其余的数 普通筛法: 时间复杂度为O(nlogn

C++二叉树的建立与遍历

二叉树是一种非线性数据结构. 二叉树 由节点构成,每个节点包含节点值和指向左节点和右节点的指针.

C++链表

链表是一种逻辑结构上的线性表,物理结构上的非线性表 链表由许多节点组成,每个节点有对应的值和指向

C++C++实现顺序表

顺序表,一种线性表,因此顺序表是线性的. 因为顺序表在物理结构与逻辑结构都是连续的.意味着在内存

PythonPython基础

标识符 Python中标识符由字母,数字,下划线组成. 字母区分大小写,不能以数字开头,以下划线

算法并查集

并查集 :并为合并(合并两个节点),查为查询(查询根节点),集是一个集合. 联通块问题 //各个

K 随时打开ESC 关闭

阅读设置

设置仅保存在当前设备。

主题

背景

文章布局