当前位置: 首页 > news >正文

UVa 275 Expanding Fractions

题目分析本题要求计算两个正整数的除法的小数展开形式其中分子小于分母分母小于100010001000。输入以0 0结束。对于每个分数需要输出其小数部分从小数点开始并且如果小数是有限的即能够整除则输出完整的小数部分。如果小数是无限的则输出到循环节第一次重复之前的数字并指出循环节长度。循环节必须是最短的。每行最多输出505050个字符包括小数点。每个测试用例的输出后跟一个空行。示例分析以输入3 7为例3/70.428571428571…3/7 0.428571428571\ldots3/70.428571428571…循环节为428571428571428571长度为666因此输出.428571 The last 6 digits repeat forever.以输入345 800为例345/8000.43125345/800 0.43125345/8000.43125是有限小数输出.43125 This expansion terminates.解题思路核心数学原理本题的核心是长除法模拟竖式除法和循环节检测。在长除法过程中每一步的余数决定了后续的小数位。根据抽屉原理鸽笼原理因为分母m1000m 1000m1000余数的取值范围是000到m−1m-1m−1共mmm种可能。因此如果某个余数重复出现则后续的小数序列将开始循环。如果余数变为000则除法终止小数是有限的。算法步骤初始化设置当前余数remainder n。记录余数出现的位置使用一个数组position记录每个余数第一次出现时的位数索引。标记余数是否出现过使用一个布尔数组appeared。模拟长除法每次将余数乘以101010然后除以分母得到当前小数位digit (remainder * 10) / m。更新余数remainder (remainder * 10) % m。如果remainder之前出现过则找到了循环节循环节从该余数第一次出现的位置开始到当前位置结束。如果remainder等于000则除法终止。输出先输出小数点.。每505050个字符换行注意小数点在行首也算一个字符。根据是否终止输出对应的提示信息。为什么这种方法能保证最短循环节由于我们从第一个小数位开始模拟并记录每个余数第一次出现的位置当余数重复时从该余数第一次出现的位置到当前位置之间的数字序列就是最小循环节。这是因为余数的重复直接决定了后续小数位的重复而第一次重复的余数位置对应着循环节的最早起点。复杂度分析时间复杂度O(m)O(m)O(m)因为最多模拟mmm步就会找到循环节或终止。空间复杂度O(m)O(m)O(m)用于存储余数出现的位置和标记数组。代码实现// Expanding Fractions// UVa ID: 275// Verdict: Accepted// Submission Date: 2016-05-11// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intn,m;vectorintdigits(1001);// 存储小数位的数字vectorintposition(1001);// 记录每个余数第一次出现的位置索引vectorboolappeared(1001);// 标记余数是否出现过intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);cout.sync_with_stdio(false);while(cinnm,nm){// 初始化标记数组fill(appeared.begin(),appeared.end(),false);intindex0;// 当前小数位的索引// 当余数未出现过且余数不为0时继续模拟while(!appeared[n]n0){appeared[n]true;// 标记当前余数已出现digits[index]10*n/m;// 计算当前小数位position[n]index;// 记录该余数出现的位置n10*n%m;// 更新余数}// 输出小数点cout.;// 输出所有已计算的小数位for(inti0;iindex;i){// 每50个字符换行包括前面的小数点但这里i从0开始if(i%5049)cout\n;coutdigits[i];}// 判断是有限小数还是无限循环小数if(n0)// 余数为0说明除法终止cout\nThis expansion terminates.\n\n;else// 循环节的长度 当前索引 - 循环节开始的位置cout\nThe last (index-position[n]);cout digits repeat forever.\n\n;}}return0;}总结本题的关键在于理解长除法过程中余数与循环节的关系。通过模拟除法并记录余数出现的位置可以高效地找到最短循环节。由于分母的最大值为999999999算法的复杂度非常低可以轻松通过。
http://www.gsyq.cn/news/1355833.html

相关文章:

  • 安卓HTTPS抓包证书信任问题深度解析与系统级迁移方案
  • TrafficMonitor插件完整指南:让你的Windows任务栏变身全能信息中心
  • 从开发者反馈看taotoken api密钥管理与访问控制功能的实用性
  • 如何快速搭建跨平台漫画阅读器:Tachidesk-Sorayomi一站式配置指南
  • 利用Taotoken统一API简化多模型应用的原型开发
  • STM32新手避坑指南:用CubeMX+HAL库驱动HC-SR04超声波模块(附完整代码)
  • 摆脱论文困扰!2026年必备AI论文写作软件榜单,高质初稿轻松写
  • 构建AI模型实时反馈回路:从概念漂移到持续进化
  • 如何在苹果电脑上无缝运行Windows应用:Whisky终极指南
  • C/C++高精度算法的实现
  • 量子优化新方法:中途测量与相干反馈提升算法性能
  • 在无MMU的RISC-V MCU上移植Linux 6.10内核:基于HPM6360的实践指南
  • FANUC机器人摆焊+电弧跟踪实战:从参数详解到避坑指南(ROBOGUIDE仿真)
  • 如何快速掌握FileBrowser:面向初学者的完整Web文件管理教程
  • 3个真实故事告诉你:为什么你的Windows 11需要系统优化工具
  • 专业干货!AI专著写作工具推荐,一键生成20万字专著不是梦!
  • 2026深度实测:16款降AIGC平台测评,闭眼入这款就对了!
  • 智能安全防护识别数据集 高空作业安全带检测 安全带佩戴检测 安全带穿戴规范识别数据集 未正确佩戴安全防护措施识别 10186期
  • 2026年5月最新岳阳华容黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • Mi-Create:免费开源的小米手表表盘制作终极指南
  • YOLOv11农场羊只面部目标检测数据集-275张-sheep-1_2_2
  • 【ChatGPT】半导体激光器深度拆解、信息图10张、爆炸图10张、C++代码框架
  • 当主用模型出现波动时如何利用 Taotoken 实现快速容灾切换
  • 长鑫科技295亿IPO上会,盈利拐点提前,合肥国资或迎万亿账面资产?
  • G-Helper终极指南:告别Armoury Crate臃肿体验的3步高效方案
  • Keil编译器数据类型详解与嵌入式开发实践
  • Python 3.13字节码反编译终极指南:突破技术瓶颈的实战解决方案
  • 2026年5月最新岳阳君山黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 5分钟搞定Burp Suite中文版:让安全测试变得更简单
  • 5个技巧掌握Ventoy:告别重复格式化,实现一U盘多系统启动