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 语句可以单独使用&…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  把信息从信号中抽取出来&am…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
