【算法学习之路】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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 动静态库和_make_进度条(一)

文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…

基于springboot+vue的拖恒ERP-物资管理

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Leetcode-853. Car Fleet [C++][Java]

目录 一、题目描述 二、解题思路 Leetcode-853. Car Fleethttps://leetcode.com/problems/car-fleet/description/ 一、题目描述 There are n cars at given miles away from the starting mile 0, traveling to reach the mile target. You are given two integer array …

Vue核心知识:动态路由实现完整方案

在Vue中实现动态路由&#xff0c;并结合后端接口和数据库表设计&#xff0c;是一个复杂的项目&#xff0c;需要多个技术栈和步骤的配合。以下将详细描述整个实现过程&#xff0c;包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…

CMU15445(2023fall) Project #4 - Concurrency Control踩坑历程

把树木磨成月亮最亮时的样子&#xff0c; 就能让它更快地滚下山坡&#xff0c; 有时会比骑马还快。 完整代码见&#xff1a; SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering…

天疱疮是一种慢性、严重的皮肤疾病

天疱疮是一种慢性、严重的皮肤疾病&#xff0c;对患者的日常生活带来很大的困扰。为了更好地预防天疱疮的发生&#xff0c;我们需要了解其成因及传播途径&#xff0c;并采取相应的预防措施。以下是关于天疱疮预防的小知识。 一、了解天疱疮 天疱疮是一种自身免疫性疾病&#…

神经网络代码入门解析

神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…

解决android studio(ladybug版本) gradle的一些task突然消失了

今天不知道干了啥&#xff0c;AS&#xff08;ladybug版本&#xff09;右边gradle的task有些不见了&#xff0c;研究了半天解决了&#xff0c;这里记录下&#xff1a; 操作&#xff1a; File -->Settings-->Experimental--> 取消选项“Enable support for multi-vari…

软件测试之白盒测试知识总结

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 概念与定义 白盒测试&#xff1a;侧重于系统或部件内部机制的测试&#xff0c;类型分为分支测试&#xff08;判定节点测试&#xff09;、路径测试、语句测试…

Unity中动态切换光照贴图的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;网络变压器的主要电性参数与测试方法&#xff08;2&#xff09;.. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法&#xff1a; 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…

前端正则表达式完全指南:从入门到实战

文章目录 第一章&#xff1a;正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章&#xff1a;正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章&#xff1a;前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…

C++Primer学习(4.8位运算符)

4.8位运算符 位运算符作用于整数类型的运算对象&#xff0c;并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能&#xff0c;如17.2节(第640页)将要介绍的&#xff0c;一种名为bitset的标准库类型也可以表示任意大小的二进制位集合,所以位运算符同样能用…

排序算法(3):

这是我们的最后一篇排序算法了&#xff0c;也是我们的初阶数据结构的最后一篇了。 我们来看&#xff0c;我们之前已经讲完了插入排序&#xff0c;选择排序&#xff0c;交换排序&#xff0c;我们还剩下最后一个归并排序&#xff0c;我们今天就讲解归并排序&#xff0c;另外我们还…

【Java项目】基于SpringBoot的Java学习平台

【Java项目】基于SpringBoot的Java学习平台 技术简介&#xff1a;采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构&#xff0c;前端通过浏览器与后端数据库进行信息交互&#xff0c;后端使用SpringBoot框架和MySQL数据库进行数据处理和存储&#xff0c;实现…

单例模式——c++

一个类&#xff0c;只能有1个对象 (对象在堆空间) 再次创建该对象&#xff0c;直接引用之前的对象 so构造函数不能随意调用 so构造函数私有 so对象不能构造 如何调用私有化的构造函数: 公开接口调用构造函数 调用构造函数&#xff1a;singleTon instance&#xff1b; 但…

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. 排…

虚拟化园区网络部署指南

《虚拟化园区网络部署指南》属于博主的“园区网”专栏&#xff0c;若想成为HCIE&#xff0c;对于园区网相关的知识需要非常了解&#xff0c;更多关于园区网的内容博主会更新在“园区网”专栏里&#xff0c;请持续关注&#xff01; 一.前言 华为CloudCampus解决方案基于智简网络…

Java数据结构第十五期:走进二叉树的奇妙世界(四)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、二叉树OJ练习题&#xff08;续&#xff09; 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…