C++中高精度运算问题
前言:在备赛蓝桥杯时,遇到C++处理数值较大的浮点数问题,特此记录一下。
C++ 的 std::string
类使用动态内存分配,其长度可以根据需要动态增加或减少,自动调整内存大小以适应字符串内容的变化。当字符串长度超过当前分配的内存时,std::string
会自动重新分配更大的内存空间以容纳更多字符。这种动态内存管理使得 std::string
在大多数情况下没有长度限制。
数据类型 | 描述 | 大小(字节) | 范围/取值示例 |
---|---|---|---|
bool | 布尔类型,表示真或假 | 1 | true 或 false |
char | 字符类型,通常用于存储 ASCII 字符 | 1 | -128 到 127 或 0 到 255 |
signed char | 有符号字符类型 | 1 | -128 到 127 |
unsigned char | 无符号字符类型 | 1 | 0 到 255 |
short | 短整型 | 2 | -32,768 到 32,767 |
unsigned short | 无符号短整型 | 2 | 0 到 65,535 |
int | 整型 | 4 | -2,147,483,648 到 2,147,483,647 |
unsigned int | 无符号整型 | 4 | 0 到 4,294,967,295 |
long | 长整型 | 4 或 8 | 取决于平台 |
unsigned long | 无符号长整型 | 4 或 8 | 取决于平台 |
long long | 长长整型(C++11 引入) | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long long | 无符号长长整型(C++11 引入) | 8 | 0 到 18,446,744,073,709,551,615 |
float | 单精度浮点数 | 4 | 约 ±3.4e±38(6-7 位有效数字) |
double | 双精度浮点数 | 8 | 约 ±1.7e±308(15 位有效数字) |
long double | 扩展精度浮点数 | 8、12 或 16 | 取决于平台 |
题目:传送门
题解:
#include<bits/stdc++.h>using namespace std;string add(string num1, string num2) {int carry = 0;string result;int i = num1.length() - 1;int j = num2.length() - 1;while (i >= 0 || j >= 0 || carry > 0) {int digit1 = (i >= 0) ? num1[i--] - '0' : 0; int digit2 = (j >= 0) ? num2[j--] - '0' : 0;int sum = digit1 + digit2 + carry;carry = sum / 10;result += to_string(sum % 10);}reverse(result.begin(), result.end());return result;
}string multiply(string num1, int num2) {int carry = 0;string result;for (int i = num1.length() - 1; i >= 0; --i) {int digit = num1[i] - '0';int product = digit * num2 + carry;carry = product / 10;result += to_string(product % 10);}if (carry > 0) {result += to_string(carry);}reverse(result.begin(), result.end());return result;
}string multiply(string num1, string num2) {string result = "0";for (int i = num2.length() - 1; i >= 0; --i) {string temp = multiply(num1, num2[i] - '0');temp += string(num2.length() - 1 - i, '0');result = add(result, temp);}return result;
}int main() {int n; string d; cin >> n >> d;size_t pos = d.find('.');string d1 = d.substr(0, pos);string d2 = d.substr(pos + 1);int len_float = d2.size();string pow2n = "1";for (int i = 1; i <= n; ++i) pow2n = multiply(pow2n, "2");d1 = multiply(d1, pow2n);d2 = multiply(d2, pow2n);string d2_int = "0";if(d2.size() != len_float) d2_int = d2.substr(0, d2.size() - len_float);int x = d2[d2.size() - len_float] - '0';if (x >= 5) d2_int = add(d2_int, "1");cout << add(d1, d2_int) << '\n';return 0;
}
举例说明 :
1. add( string , string )
string add(string num1, string num2) {int carry = 0; // 进位string result; // 存储结果int i = num1.length() - 1; // num1 的最后一个字符索引int j = num2.length() - 1; // num2 的最后一个字符索引while (i >= 0 || j >= 0 || carry > 0) {int digit1 = (i >= 0) ? num1[i--] - '0' : 0; // 获取 num1 当前位的数字int digit2 = (j >= 0) ? num2[j--] - '0' : 0; // 获取 num2 当前位的数字int sum = digit1 + digit2 + carry; // 计算当前位的和carry = sum / 10; // 更新进位result += to_string(sum % 10); // 将当前位的结果添加到结果字符串中}reverse(result.begin(), result.end()); // 反转结果字符串return result; // 返回最终结果
}
假设我们要计算 num1 = "123"
和 num2 = "456"
的和。
-
初始化:
-
carry = 0
-
result = ""
-
i = 2
(指向num1
的最后一个字符 ‘3’) -
j = 2
(指向num2
的最后一个字符 ‘6’)
-
-
第一次循环:
-
digit1 = 3
(从num1[2]
) -
digit2 = 6
(从num2[2]
) -
sum = 3 + 6 + 0 = 9
-
carry = 9 / 10 = 0
-
result = "9"
-
-
第二次循环:
-
i = 1
,j = 1
-
digit1 = 2
(从num1[1]
) -
digit2 = 5
(从num2[1]
) -
sum = 2 + 5 + 0 = 7
-
carry = 7 / 10 = 0
-
result = "97"
-
-
第三次循环:
-
i = 0
,j = 0
-
digit1 = 1
(从num1[0]
) -
digit2 = 4
(从num2[0]
) -
sum = 1 + 4 + 0 = 5
-
carry = 5 / 10 = 0
-
result = "975"
-
-
第四次循环:
-
i = -1
,j = -1
-
carry = 0
,循环条件不再满足,退出循环。
-
-
反转结果:
-
result
在反转后变为"579"
。
-
-
返回结果:
-
函数返回字符串
"579"
。
-
2. multiply(string , int )
string multiply(string num1, int num2) {int carry = 0; // 进位string result; // 存储结果for (int i = num1.length() - 1; i >= 0; --i) {int digit = num1[i] - '0'; // 获取当前位的数字int product = digit * num2 + carry; // 计算当前位的乘积carry = product / 10; // 更新进位result += to_string(product % 10); // 将当前位的结果添加到结果字符串中}if (carry > 0) {result += to_string(carry); // 如果还有进位,添加到结果中}reverse(result.begin(), result.end()); // 反转结果字符串return result; // 返回最终结果
}
假设我们要计算 num1 = "123"
和 num2 = 4
的乘积。
-
初始化:
-
carry = 0
-
result = ""
-
-
循环处理每一位:
-
从
num1
的最后一位开始,逐位处理。
-
-
第一次循环(i = 2,处理 '3’):
-
digit = 3
(从num1[2]
) -
product = 3 * 4 + 0 = 12
-
carry = 12 / 10 = 1
-
result += to_string(12 % 10) = "2"
(当前结果是 “2”)
-
-
第二次循环(i = 1,处理 '2’):
-
digit = 2
(从num1[1]
) -
product = 2 * 4 + 1 = 9
-
carry = 9 / 10 = 0
-
result += to_string(9 % 10) = "2" + "9"
(当前结果是 “29”)
-
-
第三次循环(i = 0,处理 '1’):
-
digit = 1
(从num1[0]
) -
product = 1 * 4 + 0 = 4
-
carry = 4 / 10 = 0
-
result += to_string(4 % 10) = "29" + "4"
(当前结果是 “294”)
-
-
检查进位:
-
carry
为 0,因此不需要添加额外的进位。
-
-
反转结果:
-
result
在反转后变为"492"
。
-
-
返回结果:
-
函数返回字符串
"492"
。
-
相关文章:
C++中高精度运算问题
前言:在备赛蓝桥杯时,遇到C处理数值较大的浮点数问题,特此记录一下。 C 的 std::string 类使用动态内存分配,其长度可以根据需要动态增加或减少,自动调整内存大小以适应字符串内容的变化。当字符串长度超过当前分配的…...
开篇 - 配置Unlua+VsCode的智能提示、调试以及学习方法
智能提示 为要绑定Lua的蓝图创建模板文件,这会在Content/Script下生成lua文件 然后点击生成智能代码提示,这会在Plugins/Unlua/Intermediate/生成Intenllisense文件夹 打开VSCode,点击文件->将工作区另存为。生成一个空工作区,放置在工程…...
前端快速入门学习4——CSS盒子模型、浮动、定位
一、盒子模型 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,…...
在 ASP.NET Web Forms 项目中,编译后可能找不到 `Login.aspx.cs` 的源码文件的原因?
在 ASP.NET Web Forms 项目中,确实存在一种情况:编译后可能找不到 Login.aspx.cs 的源码文件。以下是对此现象的详细分析和解释: 1. 已知信息 您提供的 Web.config 文件显示这是一个 ASP.NET Web Forms 项目。在 ASP.NET 中,.asp…...
centos7 yum install docker 安装错误
1、错误信息: [rootlocalhost atguigu]# yum install docker 已加载插件:fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…...
spring mvc异步请求 sse 大文件下载 断点续传下载Range
学习连接 异步Servlet3.0 Spring Boot 处理异步请求(DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总) spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…...
Java项目集成大模型(通译千问)
1:打开阿里云搜索 通义大模型,然后点击丰富开发API接口。 2:可以看到有openAi和DashScope两种模式,我们这次采用DashScope方法,点击DashScope 3:点击获取Apikey 然后点击 前往我得Api-key跳转到控制台&…...
Lisp语言的安全协议
Lisp语言与安全协议的结合 引言 在信息社会的今天,数据的安全性和隐私保护愈发重要。随着网络攻击手段的不断演进,各种安全协议相继被提出与实现。与此同时,Lisp作为一种古老且灵活的计算机编程语言,虽然并不是主流的系统编程语…...
【图像处理基石】什么是自动曝光(AE)?
1. 什么是自动曝光(AE)? 自动曝光(Auto Exposure, AE)是一种通过调整相机参数(如曝光时间、增益、光圈等)使图像亮度达到目标值的技术。其核心是通过实时分析图像亮度,动态优化参数…...
清明假期间
1.思维导图 2.90题 3. #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std;class Weapon;class Hero{ private:int hp;…...
el-tabs添加按钮增加点击禁止样式
前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮,没有点击样式,用户感知不明显没有限制最大的tab添加数量,可以无限添加 调整目标&代码编写 调整目标…...
Elasticsearch DSL 中的 aggs 聚合
一、聚合的概述 Elasticsearch 的 聚合(Aggregations) 功能用于对数据进行多维分析和统计,支持从简单的指标计算到复杂的分组分析。以下是聚合的基本结构: {"aggs": { // 也可以使用"agg…...
API调用类型全面指南:理解基础知识
在当今快速发展的数字化环境中,API(应用程序编程接口)是不同软件应用程序能够无缝通信的基石。无论是开发移动应用、集成第三方服务,还是构建强大的Web平台,理解各种API调用类型至关重要。那么,API调用到底…...
华东师范地面机器人融合空中无人机视角的具身导航!KiteRunner:语言驱动的户外环境合作式局部-全局导航策略
作者:Shibo Huang 1 ^{1} 1, Chenfan Shi 1 ^{1} 1, Jian Yang 2 ^{2} 2, Hanlin Dong 1 ^{1} 1, Jinpeng Mi 3 ^{3} 3, Ke Li 2 ^{2} 2, Jianfeng Zhang 1 ^{1} 1, Miao Ding 4 ^{4} 4, Peidong Liang 5 ^{5} 5, Xiong You 2 ^{2} 2, Xian Wei 1 ^{1} 1单位&#x…...
Ansible(6)——管理变量
目录 一、Ansible 变量: 1、什么是变量: 2、变量可能包含的值: 3、变量命名: 4、定义变量: 二、Playbook 中的变量: 1、在 Playbook 中定义变量: (1)最简单的定…...
Git常用问题收集
gitignore 忽略文件夹 不生效 有时候我们接手别人的项目时,发现有的忽略不对想要修改,但发现修改忽略.gitignore后无效。原因是如果某些文件已经被纳入版本管理在.gitignore中忽略路径是不起作用的,这时候需要先清除本地缓存,然后…...
构建高效多标签选择组件:从设计到实现
在现代Web应用中,多标签选择功能已成为常见需求,特别是在内容分类、文章标签、用户兴趣选择等场景。本文将深入解析一个完整的多标签选择实现方案,涵盖交互设计、核心功能和优化技巧。 组件功能概述 这个多标签选择组件提供以下核心功能&am…...
4.1论文阅读
一:PhDnet:一种用于遥感图像的新型物理感知去雾网络(A novel physic-aware dehazing network for remote sensing images) 论文链接 只是粗略读了一下,关于遥感图像去雾,圆形U--net,加入了物理…...
【渗透测试】Vulnhub靶机-HA: Armour-详细通关教程
下载地址:https://www.vulnhub.com/entry/ha-armour,370/ 目录 前言 信息收集 tftp获取(spiderman) 查看.htpasswd(ant-man) ssh欢迎信息提示(hulkbuster) 反弹shell 提权(i…...
Flask使用MySQL数据库通过Flask-SQLAlchemy 迁移数据库,实际更新文件,但是提示没有检测到数据更新。
本地写了一个model的用户类,数据库连接信息正确,执行下面2条命令进行数据库迁移。 flask db migrate 生成迁移文件 flask db upgrade 执行迁移文件的升级 发现执行完后:提示没有检测到数据的更新 PS C:\Users\mu> flask db migrate IN…...
【leetcode100】前K个高频元素
1、题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 2、初始思路 2.1 思路 全排列…...
内网渗透-MySQL提权
MySQL提权 mysql的权限提升通常有两种: UDF提权(常用) 写文件提权启动项提权mof提权一、UDF提权 UDF 全称为user defined function,用户自定义函数 用户可以添加自定义的新函数到Mysql中,以达到功能的扩充…...
Hibernate核心方法总结
Session中的核心方法梳理 1、save方法 这个方法表示将一个对象保存到数据库中,可以将一个不含OID的new出来的临时对象转换为一个处于Session缓存中具有OID的持久化对象。 需要注意的是:在save方法前设置OID是无效的但是也不会报错,在save方…...
DevOps 与持续集成(CI/CD)
1. DevOps 概述 DevOps(Development + Operations)是一种软件开发方法,强调开发(Dev)与运维(Ops)协作,通过自动化工具提高软件交付效率。其目标是: ✅ 提高部署速度 —— 频繁发布新版本 ✅ 减少人为错误 —— 通过自动化降低运维风险 ✅ 增强可观测性 —— 监控和日…...
下一代AI App架构:前端生成,后端消失
过去十年,Web 和 App 的开发范式基本稳定:前端负责交互体验,后端负责业务逻辑和数据管理。即使是“无服务架构”也只是将后端“拆散”而非“消失”。 但随着 AI 原生应用的兴起,特别是 大模型本地化、小模型部署、WebAssembly、L…...
告别过去,奔向未来
人生就是一个不断雕刻自己的过程!一路走来,我们经历过酸甜苦辣咸,迷茫过,跌倒过,懈怠过……但是,我想说这又何妨!一个成功人士的经历必定是跌跌宕宕,起起伏伏的。关键是我们要做到&a…...
AF3 Recycling机制
在 AlphaFold3中,输入数据的特征加工中生成了recycling 维度的数据,主要通过ensembled_transform_fns函数抽样得到不同的扰动的MSA、template特征等,类似于数据增强的作用。在数据集的加载和模型的训练中利用了这一维度的数据,增强了模型的稳定性和鲁棒性,避免单一预测结果…...
notepad++8.6.4安装及细节
notepad8.6.4下载安装(附安装包) 一、安装包下载1.1方法一:官网下载(点击跳转)1.2方法二:网盘链接分享8.6.4版本 二、安装过程细节2.1这里的组件建议全部勾选。点击“下一步”。2.2 勾选①:可以…...
谁该处理我的请假?——责任链模式
谁该处理我的请假?——责任链模式 一、生活中的责任链:请假审批流程二、责任链模式的核心特点三、代码实现:请假审批责任链四、工作中的实际应用场景五、框架中的经典应用六、模式本质理解 一、生活中的责任链:请假审批流程 想象…...
【NLP应用场景全解】自然语言处理如何改变世界?
自然语言处理作为人工智能的重要分支,正在加速改变各行各业。根据Statista预测,到2025年,全球NLP市场规模将达到438亿美元。本文将系统梳理NLP的主要应用场景,结合最新技术趋势,帮助你了解NLP技术的落地现状与未来发展…...
Hive 中书写SQL注意的地方
1.1 关于 DDL (1)创建带有主键约束的 Hive 表时报错。 Hive 目前还没有严格支持“主键约束”,创建带有主键约束的 HIVE 表时报了如下错误: SemanticException [Error 10326]: Invalid Constraint: syntax ENABLE/ENFORCED featu…...
Ubuntu 下 无界面环境 多进程/多线程 使用DrissionPage
使用wget “https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb” -O chrome.deb 安装chrome # !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: dp.py time: 2025/2/20 20:22 desc:wget "htt…...
Opencv计算机视觉编程攻略-第十节 估算图像之间的投影关系
目录 1. 计算图像对的基础矩阵 2. 用RANSAC 算法匹配图像 3. 计算两幅图像之间的单应矩阵 4. 检测图像中的平面目标 图像通常是由数码相机拍摄的,它通过透镜投射光线成像,是三维场景在二维平面上的投影,这表明场景和它的图像之间以及同一…...
RocketMQ 01
今天是2025/04/06 21:31 day 18 总路线请移步主页Java大纲相关文章 今天进行RocketMQ 1,2 个模块的归纳 首先是RocketMQ 的相关内容概括的思维导图 1. 核心组件 1.1 NameServer 核心功能 服务发现:作为轻量级注册中心,管理所有 Broker 的地址和路由信…...
牛客周赛———字符串
题目如下 思路(贪心) >和<的位置是固定不变的,所以先处理这两个符号,然后再遍历一遍检查‘Z’,如果不符合条件将Z的位置改变正负性使其满足条件,然后遍历的时候记数答案就行了,注意s的首…...
在Hive中,将数据从一个表查询并插入到另一个表
1. 确认目标表结构 确保目标表已存在且结构与查询结果匹配。若不存在,需先创建: CREATE TABLE target_table ( id INT, name STRING ) PARTITIONED BY (dt STRING) STORED AS ORC; 2. 选择插入方式 覆盖插入(替换现有数据࿰…...
优雅实现级联选择器:CascadeSelect 类设计与实现
在现代Web开发中,级联选择器是一种常见的UI组件,它能够有效地组织和展示层级数据。本文将深入解析一个功能完善的级联选择器实现——CascadeSelect类,展示如何用面向对象的方式构建可复用的UI组件。 组件概述 CascadeSelect是一个二级下拉框…...
26考研 | 王道 | 数据结构 | 第五章 树
第五章 树 5.1. 树的概念 5.1.1. 树的基本定义 树:n(n>0)个节点的有限集合,是一种逻辑结构,当n0时为空树,且非空树满足: 有且仅有一个特定的称为根的节点当n>1时,其余结点可分为m (m >0) 个互不相交的有限集合&#x…...
Spring 怎么解决循环依赖问题?
Spring 循环依赖(circular dependency) 指的是多个 Bean 之间的相互依赖,比如: A 依赖 B,B 又依赖 A;或者 A → B → C → A 这种嵌套循环依赖。 这是一个常见又棘手的问题,但 Spring 是可以解…...
微软推出首款量子计算芯片Majorana 1
全球首款拓扑架构量子芯片问世,2025年2月20日,经过近20年研究,微软推出了首款量子计算芯片Majorana 1,其宣传视频如本文末尾所示。 微软表示,开发Majorana 1需要创造一种全新的物质状态,即所谓的“拓扑体”…...
OSI模型中协议数据单元(PDU)
OSI模型中协议数据单元(PDU) 协议数据单元(Protocol Data Unit, PDU)是网络通信中每一层协议处理的数据单位,其内容和格式由特定层的协议定义。PDU在不同OSI层次中有不同的名称和结构,体现了分层模型的核心…...
代码训练营day24 回溯算法
回溯算法part03 93.复原IP地址 题目链接/文章讲解:代码随想录 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 本题关键在于终止条件 插入3个’.’时判断 ip地址最后一段是否…...
DP Alt Mode 与 DP协议的关系
1. 什么是 “Alt Mode”(替代模式)? Alt Mode(Alternative Mode) 是 USB Type-C 接口 的扩展协议机制,允许通过 物理接口复用(Pin Reuse) 将USB-C接口动态切换为其他协议࿰…...
【欧拉筛】哥德巴赫猜想题解
哥德巴赫猜想题解 题目传送门 1292. 哥德巴赫猜想 一、题目描述 哥德巴赫猜想指出:任意一个大于4的偶数都可以拆成两个奇素数之和。给定多个偶数(6 ≤ n < 10^6),验证它们是否符合这个猜想。对于每个偶数,输出其素数分解中两数差最大的…...
A*算法详解及Python实现
一、什么是A*算法? A*(读作"A-star")算法是一种广泛使用的路径查找和图形遍历算法,它结合了Dijkstra算法的完备性和贪婪最佳优先搜索的高效性。A*算法通过使用启发式函数来估算从当前节点到目标节点的成本,…...
【C++】第九节—string类(中)——详解+代码示例
hello! 云边有个稻草人-CSDN博客 C_云边有个稻草人的博客-CSDN博客 菜鸡进化中。。。 目录 【补充】 二、string类里面的常用接口 1.resize 2.insert 3.assign 4.erase 5.replacefind 6.c_str 7.rfindsubstr 8.find_first_of、find_last_of、find_first…...
vite.config.js常用配置
vite 是一个基于 Vue3 单文件组件的非打包开发服务器,它做到了本地快速开发启动: 快速的冷启动,不需要等待打包操作; 即时的热模块更新,替换性能和模块数量的解耦让更新飞起; 真正的按需编译,不…...
【C++11(下)】—— 我与C++的不解之缘(三十二)
前言 随着 C11 的引入,现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式(Lambda Expression),它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用,可以…...
李臻20242817_安全文件传输系统项目报告_第6周
安全文件传输系统项目报告(第 1 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…...
使用SymPy求解矩阵微分方程
引言 在数学、物理、工程等领域,微分方程常常被用来描述系统的变化和动态过程。对于多变量系统或者多方程系统,矩阵微分方程是非常常见的,它可以用来描述如电路、控制系统、振动系统等复杂的动态行为。今天,我们将通过Python 中的 SymPy 库来求解矩阵微分方程,帮助大家轻…...