Python蓝桥杯刷题-小数第n位详解
题目描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开始的 3 位数。
输入描述
输入一行三个整数:a b n,用空格分开。a 是被除数,b 是除数,n 是所求的小数后位置(0<a,b,n<10的9次方)
输出描述
输出一行 3 位数字,表示:a 除以 b,小数后第 n 位开始的 3 位数字。
分析
首先,我们得明确几个关键点:
1. 如何处理除法后的循环小数?比如像1/3=0.(3)这样的无限循环小数,如何快速定位到第n位?
2. 当小数部分是有限的时候,比如1/8=0.125,之后都是0,这时候如果n超过有效位数,后面的三位应该是0吗?
3. 题目中的n的范围很大,可能到1e9,所以直接进行除法计算然后取小数点后的位数是不现实的,必须找到数学方法或规律来快速定位。
我们来思考如何解决这些问题。
a除以b的结果的小数部分可以分为两种情况:有限小数和无限循环小数。但根据题目描述,题目将所有有限小数视为末尾有无限个0的形式。例如,0.125被视为0.125000...。因此,无论哪种情况,我们都可以将小数部分视为一个循环体,或者是有限小数后面跟着无限个0的循环。
那如何找到小数点后的第n位开始的三个数字呢?
我们先处理除法后的余数,找到小数部分的每一位。但由于n可能非常大,直接逐位计算到第n位是不现实的。必须找到数学上的规律,或者利用模运算的性质来快速定位。我们知道,当进行除法时,余数的重复出现会导致循环的开始。例如,计算1/7=0.(142857),余数会依次出现1→3→2→6→4→5→1,循环开始。因此,如果能找到余数的循环周期,就能快速定位到第n位的位置。
但这里的问题可能不需要找到整个循环周期,而是直接通过计算余数来找到第n位。因为每次余数乘以10再除以b,得到下一位的数字,同时余数更新为新的余数。这个过程可以表示为:
对于第k位小数,余数r_k = (r_{k-1} * 10) % b,而该位的数字是 (r_{k-1} * 10) // b。
因此,要找到第n位,只需要计算到第n次余数,然后取该位的数字。但问题是,n可能非常大,比如1e9,直接迭代计算n次显然会超时。因此,必须找到一种快速计算到第n位余数的方法。
这时候,快速幂模运算派上用场。因为每次余数的计算相当于乘以10,再取模b。而这个过程可以视为求10的幂次模b的值,然后应用到初始余数上。
方法思路
-
余数判断:首先计算 amod b。如果余数为0,则所有小数位均为0,直接输出"000"。
-
快速幂模运算:利用快速幂算法计算
,以快速定位到第 n 位。
-
逐位计算:通过余数逐位计算第 n、n+1、n+2 位的数字,并处理循环小数或后续全0的情况。
具体分析
-
小数部分的规律:
-
小数部分是通过不断将余数乘以10,再除以 b得到的。
-
比如 1÷8:
-
余数 1×10=10,10÷8=1(第1位是1),余数是 2。
-
余数 2×10=20,20÷8=2(第2位是2),余数是 4。
-
余数 4×10=40,40÷8=5(第3位是5),余数是 0。
-
-
-
快速定位到第 n 位:
-
直接逐位计算到第 n 位会很慢(比如 n=10的9次方)。
-
我们可以用 快速幂 来快速计算
,这样可以直接跳到第 n 位对应的余数。
-
-
逐位生成数字:
-
从第 n 位开始,通过余数逐位计算3位数字。
-
解决代码
a, b, n = map(int, input().split())
remainder = a % b # 初始余数
if remainder == 0: # 如果能整除,小数部分全是0print("000")
else:# 快速幂计算 10^(n-1) % b,快速跳到第 n 位power = pow(10, n - 1, b)# 计算第 n 位对应的余数current_remainder = (remainder * power) % b# 逐位生成3位数字digits = []for _ in range(3):digit = (current_remainder * 10) // b # 当前位的数字digits.append(digit)current_remainder = (current_remainder * 10) % b # 更新余数# 输出结果print(f"{digits[0]}{digits[1]}{digits[2]}")
该方法利用快速幂和模运算高效处理大数问题,时间复杂度为 O(logn),适用于极大范围的输入。
例子
我们可以换个例子再感受一下:
-
a=3,b=7,n=4。
-
我们需要找到 3÷7 的小数部分从第4位开始的连续3位数字。
小数部分的生成规律
首先,我们来看 3÷7 的小数部分是如何生成的:
-
余数 3×10=30,30÷7=4(第1位是4),余数是 2。
-
余数 2×10=20,20÷7=2(第2位是2),余数是 6。
-
余数 6×10=60,60÷7=8(第3位是8),余数是 4。
-
余数 4×10=40,40÷7=5(第4位是5),余数是 5。
-
余数 5×10=50,50÷7=7(第5位是7),余数是 1。
-
余数 1×10=10,10÷7=1(第6位是1),余数是 3。
-
余数 3×10=30,30÷7=4(第7位是4),余数是 2。
-
以此类推,小数部分为
0.428571428571...,循环节是428571。
如果我们直接逐位计算到第4位,需要计算4次。但如果 nn 很大(比如 n=109n=109),逐位计算会非常慢。快速幂 的作用是帮助我们快速计算出第4位对应的余数,从而跳过前面的计算。
我们需要计算 ,即 10的3次方mod 7。
-
将指数 3 表示为二进制形式:
。
-
通过平方和乘法快速计算 10的3次方:
-
。
-
。
-
-
-
计算 1000mod 7:
-
1000÷7=142余 6,所以 1000mod 7=6。
-
跳到第4位
-
初始余数:3mod 7=3。
-
快速幂计算:10的3次方 mod 7=6。
-
跳到第4位对应的余数:(3×6)mod 7=18mod 7=4。
-
逐位生成数字:
-
第4位:(4×10)÷7=5,余数是 5。
-
第5位:(5×10)÷7=7,余数是 1。
-
第6位:(1×10)÷7=1,余数是 3。
-
-
输出结果:
571。
关于快速幂相关知识,参考快速幂知识点
相关文章:
Python蓝桥杯刷题-小数第n位详解
题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。 本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开…...
Ubuntu服务器 /data 盘需要手动挂载的解决方案
服务器 /data 盘需要手动挂载的解决方案 如果重启服务器后,发现 /data 盘 没有自动挂载,通常是因为: /etc/fstab 配置文件 没有正确设置 自动挂载。该磁盘 没有被正确识别,需要手动挂载。文件系统错误 导致挂载失败。 下面是解…...
无法打开包括文件: “crtdbg.h”: No such file or directory
目录 无效解决措施(重装WindowsSDK) 有效解决措施 创建环境变量 添加环境变量INCLUDE 添加环境变量LIB RC无法运行 问题现象描述 复制以下文件至Error路径 无效解决措施(重装WindowsSDK) 参考文献:94176676/227706449-a5222d7d-d8d2-4a19-addb-8f546e69786f…...
番茄工作法html实现
对比了deepseek-r1-online和本地部署的14b的版本,输出的输出的html页面。 在线满血版的功能比较强大,可以一次完成所有要求。14b版本的功能有一些欠缺,但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
多源 BFS 是一种解决 边权为 1 的多源最短路问题 的高效算法。其核心思想是将所有源点视为一个“超级源点”,通过一次 BFS 遍历即可计算所有节点到最近源点的最短距离。以下从原理、实现和代码示例三个方面深入讲解: 目录 一、原理分析 1. 单源 BFS vs…...
使用IDEA提交SpringBoot项目到Gitee上
登录Gitee并新建仓库 创建本地仓库 提交本地代码到本地仓库 提交本地代码到远程仓库...
我们来学人工智能 -- DeepSeek客户端
DeepSeek客户端 题记使用后记系列文章 题记 我选择了 Cherry Studio是国内产品由CherryHQ团队开源是一个平台在这里,有豆包、kimi、通义千问的入口当然,最主要是作为大模型的UI正如标题,这里,作为DeepSeep的客户端 使用 下载本…...
【Linux】匿名管道的应用场景-----管道进程池
目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...
JavaScript函数-函数的使用
在JavaScript编程中,函数不仅是组织代码的基本单元,也是实现复杂逻辑、提高代码复用性和可维护性的关键工具。无论你是刚开始学习JavaScript的新手,还是希望深入理解函数使用的开发者,本文都将为你提供全面的指导。 函数的基础知…...
水果生鲜农产品推荐系统 协同过滤余弦函数推荐水果生鲜农产品 Springboot Vue Element-UI前后端分离 代码+开发文档+视频教程
水果生鲜农产品推荐系统 协同过滤余弦函数推荐水果生鲜农产品 Springboot Vue Element-UI前后端分离 【亮点功能】 1.SpringbootVueElement-UIMysql前后端分离 2.Echarts图表统计数据, 直观展示数据情况 3.发表评论后,用户可以回复评论, 回复的评论可以被再次回复, …...
Android输入事件传递流程系统源码级解析
1. 硬件层到Linux内核 设备节点:触摸事件由内核驱动捕获,写入/dev/input/eventX。关键结构体:input_event(包含时间戳、类型、代码、值)。 2. Native层处理(system_server进程) 2.1 EventHub …...
自制操作系统学习第七天
今天要做什么? 实现HLT,不让计算机处于HALT(HLT).用C语言实现内存写入(错误,需要分析) 一:使用HLT,让计算机处于睡眠状态 写了下面这个程序,naskfunc.nas 函数名叫io_h…...
【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】
最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…...
Coze插件之基于IDE创建插件
上篇文章中,我们基于已有服务创建了一些插件和工具。方便我们开发更多工作流和智能体应用。 本篇文章要介绍的是基于IDE进行创建,为什么有了基于服务创建后还有基于IDE进行创建呢?基于IDE进行创建有哪些优势? 对于一些简单操作&…...
deepseek的模型经过训练 ai写出了linux 64位加壳软件
1. 加壳程序的设计目标 目标:保护64位Linux下的可执行文件,使其难以被反编译或调试。核心功能: 在运行时加载原始可执行文件并解密。隐藏壳代码和原程序的真正入口点。提供一定的反调试机制。 2. 思路 加壳流程: 加载器…...
解锁音频新境界:LALAL.AI 与 Audo Studio 深度解析
在音频处理的世界里,噪音常常是困扰我们的一大难题。无论是专业的音频工作者,还是普通的音频爱好者,都渴望拥有一款强大的工具来解决这个问题。今天,就为大家介绍两款来自 AI 工具导航(AIDH.NET)的 AI 语音…...
Kubernetes 使用 Kube-Prometheus 构建指标监控 +飞书告警
1 介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 机器相关监控组件的本地部署和管理方案,该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置,主要包括以下几个功能: Kubernetes 自定义资源:使用 Kube…...
20250221 NLP
1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量,提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗? 是的,文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…...
【C++】const关键字的作用及常见应用场景
一、核心作用 用于定义“常量”,限制程序对变量的修改,提升代码安全性和可读性。其核心作用包括: 避免误修改:明确标识不可变数据。编译器优化:常量可被放入符号表,减少内存访问,优化执行效率…...
04控制流
一、二路分支 逻辑:程序中某段代码需要在满足某个条件时才能运行形式: if 语句:表达一种 如果-则 的条件执行关系if-else 语句:表达一种 如果-否则 的互斥分支关系 流程图: 注意: if 语句可以单独使用&…...
5分钟快速上手:PotPlayer字幕翻译插件百度版终极使用教程
5分钟快速上手:PotPlayer字幕翻译插件百度版终极使用教程 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为看不懂的外…...
Windows API实战:从局部热键到全局钩子,构建键盘鼠标监控系统
1. 从局部热键到全局钩子的技术演进 在Windows开发中,键盘鼠标监控是自动化工具和辅助软件的基础功能。我刚开始接触这个领域时,也是从最简单的RegisterHotKey函数入手。记得第一次成功实现CtrlAltD快捷键弹出调试窗口时的兴奋感,就像找到了通…...
别再死记硬背了!用Wireshark抓包实战,5分钟搞懂UDS网络层(ISO-15765)的SF/FF/CF/FC帧
用Wireshark解密UDS网络层:从抓包实战理解ISO-15765帧结构 当你第一次面对UDS诊断协议的网络层时,那些抽象的概念和术语可能会让你感到无从下手。单帧(SF)、首帧(FF)、连续帧(CF)、流控帧(FC)这些名词在文档中反复出现,但纸上得来终觉浅。作为…...
GD32F103替换STM32F103,除了Pin to Pin还要注意这几点(硬件篇)
GD32F103替换STM32F103硬件设计实战指南 当硬件工程师面临元器件替换决策时,GD32F103系列作为STM32F103的经济型替代方案,确实能显著降低BOM成本。但在实际项目中,我们往往发现那些宣称"Pin to Pin兼容"的芯片,总会在某…...
SENT协议在新能源汽车BMS中的应用实战:如何用SAE J2716标准传输电池温度与电压
SENT协议在新能源汽车BMS中的高可靠数据传输实践 新能源汽车的电池管理系统(BMS)如同人体的神经系统,需要实时感知每个电池模组的生命体征。而SENT协议正是承载这些关键神经信号的数字传输通道。在高压、强电磁干扰的复杂车载环境中ÿ…...
EventBus @Subscribe注解全解析:除了threadMode,sticky和priority这两个属性你用对了吗?
EventBus Subscribe注解深度解析:解锁sticky与priority的高级玩法 当EventBus的Subscribe注解出现在你的Android代码中时,大多数开发者可能只关注了threadMode这个属性。但今天我们要把聚光灯转向两个常被忽视却同样强大的功能:sticky事件和p…...
个人健康管理系统小程序pf(文档+源码)_kaic
第5章 系统实现进入到这个环节,也就可以及时检查出前面设计的需求是否可靠了。一个设计良好的方案在运用于系统实现中,是会帮助系统编制人员节省时间,并提升开发效率的。所以在系统的编程阶段,也就是系统实现阶段,对于…...
哪些降重软件可以同时降低查重率和AIGC疑似率?2026年5款顶流工具深度黑盒实测
引言:在2026年的盲审里,你的论文正面临一场“被猎杀”的灾难 几天前,我的一个直博学弟在实验室崩溃大哭。他苦熬大半年、查重率仅有3.2%的完美终稿,在学院第一波预审中被无情“斩立决”。退回的理由极其刺眼:系统判定…...
用MSP430和Cyclone IV FPGA实现单相逆变电源的PID闭环控制(附完整代码)
MSP430FPGA架构下的单相逆变电源PID闭环控制实战解析 在电力电子控制领域,实现高精度电压输出一直是工程师面临的挑战。当MSP430微控制器遇上Cyclone IV FPGA,这种混合架构为单相逆变电源的控制带来了独特优势——MCU负责复杂算法运算,FPGA专…...
Rust的#[derive(PartialEq, Eq)]派生宏与等价关系在自定义类型中的一致性
Rust语言中的类型系统以其严谨性著称,而#[derive(PartialEq, Eq)]派生宏则为自定义类型的等价关系提供了优雅的实现方式。等价关系是数学中的基本概念,要求满足自反性、对称性和传递性。在编程中,正确实现这些性质对于数据比较、集合操作等场…...
