首页 > 编程语言 >算法-高精度问题(带图详细解读~)

算法-高精度问题(带图详细解读~)

时间:2025-01-14 15:32:49浏览次数:3  
标签:10 lb lc la int s1 高精度 带图 算法

今天来分享四道大数运算的模板题.

目录

1. 大数相加

题目链接: LINK
基本思路: 存入数组, 模拟运算.

  1. 逆序字符串
  2. 补零操作
  3. 依次取数据, 依次相加
    3-1 加: (t-ret = s1[i] + s2[i] + carry) % 10;
    3-2 进: (t-ret = s1[i] + s2[i] + carry) / 10;
  4. 逆序, 返回结果

下面是图解过程:

在这里插入图片描述

参考代码:

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int a[N], b[N], c[N];
int la, lb, lc;

// ?精度加法的模版 - c = a + b;
void add(int c[], int a[], int b[])
{
	for (int i = 0; i < lc; i++)
	{
		c[i] += a[i] + b[i]; // 对应位相加,再加上进位
		c[i + 1] += c[i] / 10; // 处理进位
		c[i] %= 10; // 处理余数
	}

	if (c[lc]) lc++;
}

int main()
{
	string x, y; cin >> x >> y;

	// 1. 拆分每?位,逆序放在数组中
	la = x.size(); lb = y.size(); lc = max(la, lb);
	for (int i = 0; i < la; i++) a[la - 1 - i] = x[i] - '0';
	for (int i = 0; i < lb; i++) b[lb - 1 - i] = y[i] - '0';

	// 2. 模拟加法的过程
	add(c, a, b); // c = a + b

	// 输出结果
	for (int i = lc - 1; i >= 0; i--) cout << c[i];

	return 0;
}

2. 大数相减

题目链接: LINK
基本思想: 区分大小, 大 - 小, 存入数组, 模拟运算.
在这里插入图片描述

参考代码:

#include<iostream>
#include<string>
#include<algorithm> 
using namespace std;

int main()
{
	// 读入字符串 
	string s1;
	string s2;
	cin >> s1 >> s2;
	string ret;
	
	// 判断大小, 保证s1比较大
	if ((s1.size() < s2.size()) || (s1.size() == s2.size() && s2 > s1)) 
	{
		swap(s1, s2);
		cout << '-';
	}
	
	// 逆序一下  
	reverse(s1.begin(), s1.end());
	reverse(s2.begin(), s2.end());
	
	// 补充0 
	while(s2.size() < s1.size()) s2 += '0';
	
	// 相减 
	int borrow = 0;
	for(int i = 0; i < s1.size(); i++) 
	{
		int x = s1[i] - '0' - borrow;
		int y = s2[i] - '0';
		int sum = x - y;
		//cout << "x: " << x << " y: " << y << " sum: " << sum << endl;
		if(sum < 0)
		{
			borrow = 1;
			sum = 10 + x - y;
			//cout << "x: " << x << " y: " << y << " sum: " << sum << endl;
		}
		else
		{
			borrow = 0;	
		} 
		
		ret += sum % 10 + '0';
	}
	//cout << ret << endl;
	for(int i = ret.size() - 1; i > 0; i--)
	{
		if(ret[i] == '0') ret.pop_back();
		else break;
	}
	
	reverse(ret.begin(), ret.end());
	cout << ret << endl;
	
	return 0;
}

3. 大数相乘

题目链接: LINK
基本思路: 放到数组里模拟实现.

在这里插入图片描述

参考代码:

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int a[N], b[N], c[N];
int la, lb, lc;

// ?精度乘法的模版 - c = a * b
void mul(int c[], int a[], int b[])
{
	// ?进位相乘,然后相加
	for (int i = 0; i < la; i++)
	{
		for (int j = 0; j < lb; j++)
		{
			c[i + j] += a[i] * b[j];
		}
	}

	// 处理进位
	for (int i = 0; i < lc; i++)
	{
		c[i + 1] += c[i] / 10;
		c[i] %= 10;
	}

	// 处理前导零
	while (lc > 1 && c[lc - 1] == 0) lc--;
}

int main()
{
	string x, y; cin >> x >> y;

	// 1. 拆分每?位,逆序放在数组中
	la = x.size(); lb = y.size(); lc = la + lb;
	for (int i = 0; i < la; i++) a[la - 1 - i] = x[i] - '0';
	for (int i = 0; i < lb; i++) b[lb - 1 - i] = y[i] - '0';

	// 2. 模拟乘法的过程
	mul(c, a, b); // c = a * b

	// 输出结果
	for (int i = lc - 1; i >= 0; i--) cout << c[i];

	return 0;
}

4. 大数相除

题目链接: LINK
基本思路: 放到数组里模拟实现.
在这里插入图片描述

参考代码:

#include <iostream>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
int a[N], b, c[N];
int la, lc;
// ⾼精度除法的模板 - c = a / b (⾼精度 / 低精度)
void sub(int c[], int a[], int b)
{
	LL t = 0; // 标记每次除完之后的余数
	for (int i = la - 1; i >= 0; i--)
	{
		// 计算当前的被除数
		t = t * 10 + a[i];
		c[i] = t / b;
		t %= b;
	}

	// 处理前导 0
	while (lc > 1 && c[lc - 1] == 0) lc--;
}

int main()
{
	string x; cin >> x >> b;
	la = x.size();

	for (int i = 0; i < la; i++) a[la - 1 - i] = x[i] - '0';

	// 模拟除法的过程
	lc = la;
	sub(c, a, b); // c = a / b

	for (int i = lc - 1; i >= 0; i--) cout << c[i];


	return 0;
}

EOF.

标签:10,lb,lc,la,int,s1,高精度,带图,算法
From: https://blog.csdn.net/2302_79031646/article/details/145124539

相关文章

  • 「Note」欧几里得算法全家桶
    一,欧几里得算法1.内容\(\gcd(a,b)=\gcd(b,a\modb)\)2.证明先假设\(a>b\),\(a=bx+y\),其中\(x=\lfloor\frac{a}{b}\rfloor,0\ley\ltb\)。也就是\(b\)除以\(a\)等于\(x\)余\(y\)。原命题就是\(\gcd(a,b)=\gcd(y,b)\)。由\(a=bx......
  • 【轻松掌握数据结构与算法】哈希(Hashing)
    什么是哈希?哈希是一种将任意长度的数据转换为固定长度的数据的技术。这个固定长度的数据通常被称为哈希值或哈希码。哈希函数是实现这一转换的关键,它接受任意长度的输入,并产生一个固定长度的输出。为什么使用哈希?哈希的主要用途之一是快速查找数据。通过哈希函数,我们可以将......
  • 迭代重建算法
    迭代重建算法是图像重建领域中的一种重要方法,尤其在计算机断层扫描(CT)成像中得到了广泛应用。以下是对迭代重建算法的详细介绍:一、基本原理迭代重建算法的基本思想是由测量的投影数据建立一组未知向量的代数方程式,通过方程组求解未知图像向量。具体来说,该算法首先设置一组模拟图......
  • AcWing算法周赛第6场 | 3735 构造完全图
    学习C++从娃娃抓起!记录下AcWing备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AcWing算法周赛|汇总【题目描述】给定一个由nnn个点和......
  • AcWing算法周赛第6场 | 3734 求和
    学习C++从娃娃抓起!记录下AcWing备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AcWing算法周赛|汇总【题目描述】用f(x)......
  • 代码随想录算法训练营总结
            为期2个月的训练营时间,总算是一步一步的顺利结束了,撒花撒花!!!    这个训练营算是我第一次比较系统的进行学习数据结构和算法以及刷力扣,以前总是刷到一半就半途而费了,这次总算是坚持着跟着群里的打卡节奏一步一步的完结了。    对于内容来说,内......
  • 代码随想录算法训练营第五十九天|KM47.参加科学大会|KM94.城市间货物运输Ⅰ
    47.参加科学大会(第六期模拟笔试)2、堆优化版(该方法没看懂)邻接矩阵的优点:表达方式简单,易于理解检查任意两个顶点间是否存在边的操作非常快适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。缺点:遇到稀疏图,会导致申请过大的二维数组造成空间浪费......
  • 论文研读之“YOLO v1”目标检测深度学习算法一文看懂
    文章目录YOLOv1笔记一、推理阶段1、模型结构2、推理过程解析生成预测框生成条件概率输出tensor解析3、后处理二、训练阶段1、confidence计算2、损失函数YOLOv1笔记一、推理阶段1、模型结构2、推理过程解析该图为数据集为VOC时的情况,S=7,B=2。生成预测框......
  • R语言caret包实战:构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过m
    R语言caret包实战:构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过method参数指定算法名称、通过trainControl函数控制训练过程目录R语言使用caret包构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过method参数指定算法名称、通过trainCo......
  • 2025 算法方向毕业设计选题推荐汇总 python
    目录前言毕设选题选题迷茫选题的重要性更多选题指导最后 前言  ......