基础算法学习|高精度

news2024/11/15 9:23:44

高精度

模板

高精度加法

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    //大的数+小的数
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    
    //判断最高位是否进位
    if (t) C.push_back(t);
    return C;
}

高精度减法

// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.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;
    }
    
    //去除前导0
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

高精度乘法

// C = A * b, A >= 0, b >= 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    
    //去除前导0
    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}

高精度除法

// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());

    //去除前导0
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

例题一

题目

给定两个正整数(不含前导 0),计算它们的和。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

1 ≤ 整数长度 ≤ 100000

输入样例

12
23

输出样例

35

代码示例

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <vector>
using namespace std;

vector<int> add(vector<int>& A, vector<int>& B) {
	if (A.size() < B.size()) return add(B, A);

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

	if (t) C.push_back(t);
	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');

	auto C = add(A, B);

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

例题二

题目

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1 ≤ 整数长度 ≤ 100000

输入样例

32
11

输出样例

21

代码示例

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <vector>
using namespace std;

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> C;
	int t = 0;
	for (int i = 0; i < A.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;
	}
	
    //去前导0
	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');

	if (cmp(A, B))
	{
		auto C = sub(A, B);
		for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
	}
	else
	{
		auto C = sub(B, A);
		cout << "-";
		for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
	}
	cout << endl;
	return 0;
}

例题三

题目

给定两个非负整数(不含前导 0) A 和 B,请你计算 A * B 的值。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B

输出格式

共一行,包含 A * B 的值。

数据范围

1 ≤ A的长度 ≤100000,

0 ≤ B ≤10000

输入样例

2
3

输出样例

6

代码示例

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <vector>
using namespace std;

vector<int> mul(vector<int>& A, int b) {

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

    //去前导0
	while (C.size() > 1 && C.back() == 0) C.pop_back();
	return C;
}

int main() {
	string a;
	int b;
	cin >> a >> b;

	vector<int> A;

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

	auto B = mul(A, b);

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

例题四

题目

给定两个非负整数(不含前导 0) AB,请你计算 A / B 的商和余数。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B

输出格式

共两行,第一行输出所求的商,第二行输出所求余数。

数据范围

1 ≤ A的长度 ≤100000,

0 ≤ B ≤10000,

B一定不为0

输入样例

7
2

输出样例

3
1

代码示例

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <vector>
using namespace std;

vector<int> div(vector<int>& A, int b, int& r) {

	vector<int> C;
	r = 0;

	for (int i = A.size() - 1; i >= 0; i--) {
		
		r = r * 10 + A[i];
		C.push_back(r / b);
		r %= b;
	}

	reverse(C.begin(), C.end());
	while (C.size() > 1 && C.back() == 0) C.pop_back();
	return C;
}

int main() {
	string a;
	int b, r;
	cin >> a >> b;

	vector<int> A;

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

	auto B = div(A, b, r);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网安顶刊IEEE Transactions on Dependable and Secure Computing

安全顶刊论文列表 写在最前面IEEE Transactions on Dependable and Secure ComputingTable of Contents&#xff08;March-April 2023&#xff09;Volume 20, Issue 2Table of Contents&#xff08;Sept.-Oct. 2023&#xff09;Volume 20, Issue 5 写在最前面 为了给自己找论文…

如何解决msvcp120.dll丢失?dll丢失有效的5个解决方法分享

在我日常的计算机使用过程中&#xff0c;我遇到了一个令人困扰的问题——MSVCP120丢失。这个问题不仅影响了我的工作效率&#xff0c;也让我对计算机的安全性产生了疑虑。经过一段时间的研究和解决&#xff0c;我对此问题有了深入的理解&#xff0c;并从中获得了宝贵的经验。 …

【嵌入式C语言】1--内存

1.程序运行为什么需要内存 1.计算机程序运行的目的 计算机为什么需要编程&#xff1f; 程序的目的是为了去运行&#xff0c;程序运行是为了得到一定的结果。计算机就是用来计算的&#xff0c;所有计算机程序其实都是在做计算。计算就是在计算数据&#xff0c;所以计算机程序中…

美摄美颜SDK,提供一站式美颜技术解决方案

数字化时代&#xff0c;图像处理技术已经成为企业提升用户体验&#xff0c;增强产品竞争力的重要工具。其中&#xff0c;美颜技术作为图像处理的重要组成部分&#xff0c;已经广泛应用于各类应用中&#xff0c;如社交软件、直播平台、电商平台等。为了满足企业对于美颜技术的需…

测试用例大全

一、文本框为字符型 必填项非空校验&#xff1a; 必填项未输入&#xff0d;&#xff0d;程序应提示错误&#xff1b; 必填项只输入若干个空格&#xff0c;未输入其它字符&#xff0d;&#xff0d;程序应提示错误&#xff1b; 字段唯一性校验&#xff1a;&#xff08;不是所…

秋叶Lora训练器遇到NaN detected

根据我在网络上的搜索&#xff0c;排除了图片尺寸不到位&#xff08;需要1024*1024&#xff09;、arb没开等等情况。最后发现&#xff0c;是需要在保存格式上&#xff0c;不要选fp16&#xff0c;而是选择bf16. 然后就可以运行了&#xff01;

人类科技之巅,光刻机巨头【阿斯麦股票】在第三季度财报后值得买入吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;阿斯麦&#xff08;ASML&#xff09;公布了强劲的第三季度财务业绩&#xff0c;销售额为67亿欧元&#xff0c;每股收益为4.81欧元&#xff0c;同比增长了12%。 &#xff08;2&a…

C语言指针精简版(一)

目录 理解内存、地址与指针之间的挂关系 编址与寻址&#xff08;简单理解&#xff09; 取地址操作符& 解引用操作符* 指针变量的大小 指针变量类型的意义 const修饰指针变量 const修饰变量 const修饰指针变量 指针运算 指针-整数 指针-指针 指针的运算关系 野…

高频行情数据应用解决方案

高频行情数据的因子研发和相关策略&#xff0c;是在当前金融量化投资领域普遍关注的内容。由于高频行情数据量庞大&#xff08;Level1的Tick每日10G&#xff0c;Level2的Tick每日40G&#xff09;、以及高频数据时序化处理复杂、数据访问性能等问题&#xff0c;为研发工作的开展…

C++ 的强制类型转换

C 的强制类型转换 目录(转换方式): 1 、static_cast 2 、dynamic_cast 3、reinterpret_cast 4、const_cast 5、类型转换使用建议 一、 static_cast&#xff1a; 用于基本类型之间的转换 static_cast<>() 可以说是神通广大。 使用方法 &#xff1a; type y stat…

Linux系统编程:进程part_1

进程 进程以概念为主&#xff0c;知道是怎么回事就行&#xff0c;工作一般都操作线程。 进程的基本概念 因为这些概念在OS教课书中讲的太多&#xff0c;故而这一块不会详述。 什么是进程&#xff1f; 通俗的说进程就是正在运行的程序。进程是动态的程序是静态的。 使用cat…

Pytest测试框架搭建的关键6个知识点(建议收藏)

在现代软件开发中&#xff0c;测试是确保代码质量和功能稳定性的关键步骤。而Pytest作为一个功能强大且易于使用的Python测试框架&#xff0c;为我们提供了一个优雅的方式来编写和管理测试。本文将为你介绍如何构建高效可靠的测试环境&#xff0c;着重探讨Pytest测试框架搭建时…

基于SSM的二手商品交易系统

基于SSM的二手商品交易系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 商品详情 登录界面 管理员界面 商品管理 摘要 基于Spring&#xff08;Spring MVC&…

mysql第一篇---索引

文章目录 mysql第一篇---索引索引的数据结构为什么使用索引&#xff1f;索引的及其优缺点InnoDB中索引的推演常见的索引概念InnoDB的B树索引的注意事项MyISAM中索引方案索引的代价MySQL数据结构选择的合理性 mysql第一篇—索引 索引的数据结构 为什么使用索引&#xff1f; 索…

Git快速安装【附安装包资源】

软件安装包 项目版本管理软件 Git windows版本安装包 安装步骤 双击按照包之后&#xff0c;直接next 安装位置尽量不要选择C盘&#xff0c;如果只有C盘&#xff0c;可以尝试分盘&#xff0c;如果C盘已经很小了&#xff0c;那就没办法了 选择完安装位置之后&#xff0c;直…

班主任好物 班级查询系统来啦

哈喽各位&#xff0c;作为一名教育博主&#xff0c;今天我要给大家分享一个班主任的好物——班级查询系统&#xff01;这个系统可真是太方便了呢&#xff0c;那么&#xff0c;这个神秘的班级查询系统到底是什么呢&#xff1f;别急&#xff0c;听我慢慢道来。 班级查询系统&…

数据分析:小红书节点投放指南,引爆双十一!

导语 双11大促将临&#xff0c;对于多数品牌方而言&#xff0c;其中蕴藏着巨大的流量增长机遇。面对竞争激烈的小红书种草平台&#xff0c;品牌方们又该如何提前做好准备&#xff0c;掌握营销节奏&#xff0c;真正抓住流量密码呢&#xff1f;接下来由小编一一道来。 双十一剁…

前端 js 之 面向对象(原型、原型链及继承) 06

今天又是一个美好的一天耶 &#xff01; ✌ 文章目录 一、面向对象编程之前二、原型 与 原型链 &#x1f381;三、new 的原理 &#x1f91e;四、面向对象的优势五、继承 (构造函数之间的)ps&#xff1a; 一、面向对象编程之前 在面向对象编程之前&#xff0c;我们是 面向二进制…

Jmeter(五):json提取器元件及jsonpath介绍,响应断言元件

Jmeter&#xff1a;son提取器元件及jsonpath介绍 json提取器元件介绍 json提取器与正则表达式提取器功能类似&#xff0c;也是用来截取响应信息的部分保 存到指定的变量中去&#xff0c;不同的是&#xff0c;它只能用来处理响应正文&#xff0c;并且响应正文必须 是json格式的…

分享一下微信小程序开发的步骤是什么

随着微信小程序的日益普及和深入人心&#xff0c;许多企业和开发者都开始投身于小程序开发领域。那么&#xff0c;如何从零开始&#xff0c;一步步开发出一个自己的微信小程序呢&#xff1f;下面就让我们一起探讨微信小程序开发的步骤。 一、确定开发目标和定位 在开始开发小程…