【算法学习之路】4.简单数论(4)

简单数论(4)

  • 前言
  • 三.高精度
    • 1.什么是高精度
    • 2.解决办法
  • 精度乘除法
    • 一.精度乘法
      • 1.数据的存储
      • 2.步骤
      • 3.例题:高精度乘法
    • 二.精度除法
      • 1.例子
      • 2.步骤
      • 3.例题:高精度除法

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,滑动窗口的题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

三.高精度

1.什么是高精度

对运算的精度要求非常高,用已知的数据类型无法精确表示的数值,现有的数据类型存不下,无法计算

2.解决办法

1.一般是用数组模拟大数的运算
2.开一个比较大的整数数组或字符串
3.数组或字符串的元素代表大数的某一位
4.通过数组或字符串元素的运算模拟大数的运算
5.最后将代表大数的数组或字符串输出

精度乘除法

一.精度乘法

1.数据的存储

1.将数据存在数组中,并且0存个位数(数组a,b);
2.结果:将结果单独放入一个数组,每个单独的位置放置对应的结果,判断每个结果>是否还有进位(c);
注意:c[i+j] = a[i] * b[j]

2.步骤

1.用字符串读入,再倒着将其存在数组里
2.用两层for循环遍历这两个数组让他们相乘
3.将其存入到另一个数组中(长度位a+b)
4.用for循环遍历处理进位
5.去掉前导零

3.例题:高精度乘法

洛谷P1303 A*B Problem

题解:

#include <iostream>
#include <string>
using namespace std;
void init(int* a) {//初始化
	string s; cin >> s;
	a[0] = s.size();//数组的0位置存元素个数
	for (int i = 1; i <= a[0]; i++) {
		a[i] = s[a[0] - i] - '0';//将字符串倒着存在数组中
	}
}
//每次的除数
void numcpy(int* a, int* b, int n) {//n为后面有几个零
	a[0] = b[0] + n;//有多少位
	for (int i = 1; i <= n; i++) {//将前面初始化为零
		a[i] = 0;
	}
	for (int i = n + 1; i <= a[0]; i++) {//将值赋给
		a[i] = b[i - n];
	}
}

bool check(int* a, int* t) {//检查哪个大
	if (t[0] > a[0]) {
		return false;
	}
	else if (t[0] < a[0]) {
		return true;
	}
	else {
		for (int i = a[0]; i > 0; i--) {
			if (t[i] > a[i]) {
				return false;
			}
			else if (t[i] < a[i]) {
				return true;
			}
		}
		return true;
	}
}

void sub(int* t, int* a) {//两数相减
	for (int i = 1; i <= a[0]; i++) {
		a[i] -= t[i];
		if (a[i] < 0) {
			a[i] += 10;
			a[i + 1]--;
		}
	}
	int l = a[0];//位数
	while (a[l] == 0 && l >= 1) {//去除前导零
		a[0]--;
		l--;
	}
}

int main() {
	int a[100005], b[100005];//除数和被除数
	int ans[100005] = { 0 };//答案
	init(a);
	init(b);
	ans[0] = a[0] - b[0] + 1;//答案最多有多少位数
	if (ans[0] <= 0) {//如果除数小于被除数
		cout << '0' << endl;
		return 0;
	}
	for (int i = ans[0]; i > 0;i--) {
		int t[100005] = { 0 };//存每次的被除数
		numcpy(t, b, i - 1);
		while (check(a, t)) {
			sub(t, a);
			ans[i]++;
		}
	}
	for (int i = ans[0]; i > 0; i--) {//去掉前导零
		if (i == ans[0] && ans[i] == 0) {
			continue;
		}
		cout << ans[i];
	}

	return 0;
}

二.精度除法

本质为减法

1.例子

如:
531518 / 123 = 4321 ‘’‘’‘’ 35;
为:
531518 / 123000 = 4 ‘’‘’‘’ 39518
39518 / 12300 = 3 ‘’‘’‘’ 2618
2618 /1230 = 2 ‘’‘’‘’ 158
158 / 123 = 1 ‘’‘’‘’ 35
n位数除m位商位数最多为n - m + 1

2.步骤

1.利用字符串读入被除数和除数
2.把字符串倒着放入到数组中(把数组0的位置空出来,记录总共有多少位)
3.进行循环求商的每一位(如果a<b则商的结果为零)
注意:余数在被除数数组中

3.例题:高精度除法

洛谷P2005 A/B Problem II

#include <iostream>
#include <string>
using namespace std;
void init(int* a) {//初始化
	string s; cin >> s;
	a[0] = s.size();//数组的0位置存元素个数
	for (int i = 1; i <= a[0]; i++) {
		a[i] = s[a[0] - i] - '0';//将字符串倒着存在数组中
	}
}
//每次的除数
void numcpy(int* a, int* b, int n) {//n为后面有几个零
	a[0] = b[0] + n;//有多少位
	for (int i = 1; i <= n; i++) {//将前面初始化为零
		a[i] = 0;
	}
	for (int i = n + 1; i <= a[0]; i++) {//将值赋给
		a[i] = b[i - n];
	}
}

bool check(int* a, int* t) {//检查哪个大
	if (t[0] > a[0]) {
		return false;
	}
	else if (t[0] < a[0]) {
		return true;
	}
	else {
		for (int i = a[0]; i > 0; i--) {
			if (t[i] > a[i]) {
				return false;
			}
			else if (t[i] < a[i]) {
				return true;
			}
		}
		return true;
	}
}

void sub(int* t, int* a) {//两数相减
	for (int i = 1; i <= a[0]; i++) {
		a[i] -= t[i];
		if (a[i] < 0) {
			a[i] += 10;
			a[i + 1]--;
		}
	}
	int l = a[0];//位数
	while (a[l] == 0 && l >= 1) {//去除前导零
		a[0]--;
		l--;
	}
}

int main() {
	int a[100005], b[100005];//除数和被除数
	int ans[100005] = { 0 };//答案
	init(a);
	init(b);
	ans[0] = a[0] - b[0] + 1;//答案最多有多少位数
	if (ans[0] <= 0) {//如果除数小于被除数
		cout << '0' << endl;
		return 0;
	}
	for (int i = ans[0]; i > 0;i--) {
		int t[100005] = { 0 };//存每次的被除数
		numcpy(t, b, i - 1);
		while (check(a, t)) {
			sub(t,a);
			ans[i]++;
		}
	}
	for (int i = ans[0]; i > 0; i--) {//去掉前导零
		if (i == ans[0] && ans[i] == 0) {
			continue;
		}
		cout << ans[i];
	}

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频推拉流EasyDSS点播平台云端录像播放异常问题的排查与解决

EasyDSS视频直播点播平台是一个功能全面的系统&#xff0c;提供视频转码、点播、直播、视频推拉流以及H.265视频播放等一站式服务。该平台与RTMP高清摄像头配合使用&#xff0c;能够接收无人机设备的实时视频流&#xff0c;实现无人机视频推流直播和巡检等多种应用。 最近&…

pyQT5简易教程(一):制作一个可以选择本地图片并显示的桌面应用

可以参考之前的教程安装 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打开pycharm中的QTdesigner 二、设计界面 和之前一样,使用 PyQt Designer 来设计界面并保存为 .u…

【洛谷贪心算法】P1090合并果子

为了使消耗的体力最小&#xff0c;每次都应该选择当前重量最小的两堆果子进行合并。可以使用优先队列&#xff08;小根堆&#xff09;来实现这个过程&#xff0c;优先队列可以自动维护元素的顺序&#xff0c;每次取出堆顶的两个元素&#xff08;即最小的两个元素&#xff09;进…

第四届大数据、区块链与经济管理国际学术会议

重要信息 官网&#xff1a;www.icbbem.com 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-武汉 &#xff08;线上召开&#xff09; 简介 第四届大数据、区块链与经济管理国际学术会议(ICBBEM 2025)&#xff0c;将于2025年3月14-16日在中国湖北省武汉市召开。…

【愚公系列】《Python网络爬虫从入门到精通》037-文件的存取

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

pyside6学习专栏(八):在PySide6中使用matplotlib库绘制三维图形

本代码原来是PySide6官网的一个示例程序&#xff0c;我对其进行的详细的注释&#xff0c;同时增加了一个功能&#xff1a;加载显示cass的地形图坐标数据示例&#xff0c;示例可显示以下几种三维图形 程序运行界面如下&#xff1a; 代码如下&#xff1a; # -*- coding: utf-8 -…

【多模态大模型论文精读】MOSHI:双工实时语音对话大模型

写在前面 大型语言模型&#xff08;LLM&#xff09;的飞速发展&#xff0c;让人机对话变得越来越自然流畅。从 Alexa、Siri 到 Google Assistant&#xff0c;语音助手已经成为我们生活中不可或缺的一部分。然而&#xff0c;这些看似智能的对话系统&#xff0c;背后却隐藏着一个…

Elasticsearch --- 相关基础知识整理

目录 1、核心功能2、主要用途3、数据模型4、优势5、映射5.1 映射的作用5.2 字段数据类型5.3 动态映射与显式映射5.4 映射设置5.5 多字段与元字段5.6 映射的创建与管理5.7 映射优化建议 6、 倒排索引6.1 **倒排索引的基本概念**6.2 **倒排索引的工作原理**6.3 **倒排索引的优势*…

lqb官方题单-速成刷题清单(上) - python版

预计3月5日 Wednesday 前完成 【2025年3月1日&#xff0c;记】题目太简单了&#xff0c;3月3日前完成 蓝桥杯速成刷题清单&#xff08;上&#xff09; https://www.lanqiao.cn/problems/1216/learning/?problem_list_id30&page1 替换题号1216 目录 进度题解和碎碎念1. 排…

计算机网络——详解TCP三握四挥

文章目录 前言一、三次握手1.1 三次握手流程1.2 tcp为什么需要三次握手建立连接&#xff1f; 二、四次挥手2.1 四次挥手流程2.2 为什么是四次&#xff0c;不是三次&#xff1f;2.3 为什么要等待2msl&#xff1f;2.4 TCP的保活计时器 前言 TCP和UDP是计算机网络结构中运输层的两…

【AD】3-6 层次原理图

自上而下 1.放置-页面符号&#xff0c;并设置属性 2.放置-端口 可通过如下设置将自动生成关掉 3.放置-添加图纸入口&#xff0c;并创建图纸 自下而上 1.子图的原理图页设计 设计资原理图&#xff0c;复制网络标签&#xff0c;智能粘贴未PORT 2.新建主图原理图 创建框…

C语言【指针篇】(四)

前言&#xff1a;正文1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么?2.2 数组指针变量怎么初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移表 总结 前言&am…

认识苹果SWIFT语言

Swift 是苹果公司于 2014 年在 WWDC&#xff08;苹果全球开发者大会&#xff09;上发布的一种编程语言&#xff0c;旨在替代 Objective-C&#xff0c;用于开发 iOS、macOS、watchOS 和 tvOS 等苹果平台的应用程序。Swift 的设计目标是结合 C 和 Objective-C 的优点&#xff0c;…

python集合set的常用方法

目录 集合的定义 集合的基础操作 多个集合之间的操作 集合的for循环 集合的定义 集合的基础操作 集合.add(元素) 添加新元素 集合.pop() 从集合中随机取出一个元素 集合.clear() 清空集合 集合.remove(元素) 移除元素 #定义集合,集合自动去重了 set1{"春"…

2019年01月全国POI数据分享(同源历史POI分享系列)

2019年01月全国范围POI数据 2019年01月份全国范围历史POI数据&#xff0c;全国范围所有类别共59336781个POI 2019年01月全国范围POI数据按大类统计 大类代码大类名称2019年01月该类POI数量010000汽车服务1151164020000汽车销售213647030000汽车维修517367040000摩托车服务1800…

简单介绍JVM

1.什么是JVM&#xff1f; JVM就是Java虚拟机【Java Virtual Machine】&#xff0c;简称JVM。主要部分包括类加载子系统&#xff0c;运行时数据区&#xff0c;执行引擎&#xff0c;本地方法库等&#xff0c;接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…

关于流水线的理解

还是不太理解&#xff0c;我之前一直以为&#xff0c;对axis总线&#xff0c;每一级的寄存器就像fifo一样&#xff0c;一级一级的分级存储最后一级需要的数据。 像这张图&#xff0c;一开始是在解析axis流形式的数据包&#xff0c;数据包一直都能输入&#xff0c;所以valid一直…

基于PHP和MySQL的用户登录注册系统实现

系统架构 系统采用前后端分离的架构&#xff0c;使用PHP作为后端语言&#xff0c;MySQL作为数据库。以下是系统的整体架构图&#xff1a; 这个架构图展示了系统的三个主要层次&#xff1a; 前端界面层&#xff1a;包含用户交互的三个页面&#xff08;注册、登录和欢迎页面&am…

【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)

第二届边缘计算与并行、分布式计算国际学术会议&#xff08;ECPDC 2025&#xff09;将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(七) 主题设置

1. 引入daisyUi 我们用的是^4.12.23版本 daisyUI介绍 Install daisyUI as a Tailwind CSS plugin — Tailwind CSS Components ( version 4 update is here ) 切换主题功能我们仿照daisyUI themes — Tailwind CSS Components ( version 5 update is here ) 1.在tailwind.co…