有理数的循环节

1 / 7 = 0.142857142 ⋯ ⋯ 1/7 = 0.142857142 \cdots\cdots 1/7=0.142857142⋯⋯ 是个无限循环小数。

任何有理数都可以表示为无限循环小数的形式。

题目要求即是:给出一个数字的循环小数表示法。

输入描述
输入一行,两个整数。
每个整数范围均为:1 ~ 1000。

输出描述
输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。

输入输出样例
示例
输入

1,7

输出

0.[142857]

思路

  • 先模拟手算,找规律,这里不妨用题目所给的例子: 1 ÷ 7 1 \div 7 1÷7

    • 1除以7,商0余1,点上小数点,余数不为0,则把余数1乘以10之后继续除以7(即“添0继续除”)
    • 10除以7,商1余3,余数不为0,添0继续除
    • 30除以7,商4余2,余数不为0,添0继续除
    • 20除以7,商2余6,余数不为0,添0继续除
    • 60除以7,商8余4,余数不为0,添0继续除
    • 40除以7,商5余5,余数不为0,添0继续除
    • 50除以7,商7余1,余数不为0,添0继续除
    • ⋯ ⋯ \cdots\cdots ⋯⋯

到这里,可能已经看出规律了,再继续除下去的话就循环起来了,则已经找出了循环节

  • 然后发现,循环节的最后一个数出现的时候,其对应的余数恰好是出现过的,而这个余数上一次出现时乘10除以除数得到的商恰好是循环节的第一个数
  • 这样问题就差不多解决了,因为已经确定了循环节的首尾位置
  • 由于题目还要求输出中括号,所以商用一个数组来存放比较方便
  • 怎么知道余数已经出现过了?怎么确定循环节的第一个数字?
  • 综合考虑,选用哈希表记录出现过的余数,并且将余数和小数点后的位号(数组下标)建立联系,方便确定循环节
  • 通过模拟,应该还能得出一个显然的规律:当相除的结果是无限循环小数时,最后一个数字一定是循环节的最后一个数字,且最终答案的最后一个字符一定是 ] ] ];而除得尽的话,就直接输出结果就行,但是依然要用数组来存放,因为好判断是否能除尽
  • 将商的整数部分和小数部分分开比较好

代码如下

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;unordered_map<int, int> mp;  //余数<->下标
vector<int> data;            //存放小数部分的数组
int n, m;                    //分子,分母void solve() {int res = 0;  //整数部分商int t = 0;    //下标scanf("%d,%d", &n, &m);//坑点,要把逗号加进去//处理整数部分res = n / m;n %= m;mp[n] = t++;//处理小数部分while (true) {if (n == 0) {//这是除得尽的情况printf("%d.", res);//整数部分//小数部分全部输出for (int i = 0; i < int(data.size()); i++) {printf("%d", data.at(i));}printf("\n");break;}n *= 10;//添0继续除data.push_back(n / m);//商n %= m;//余数更新被除数//余数不为0且余数出现过if (n && mp.find(n) != mp.end()) {printf("%d.", res);//输出整数部分//输出循环节之前的小数部分,有些循环小数要等几个数之后才开始循环for (int i = 0; i < mp[n]; i++) {printf("%d", data.at(i));}//输出循环节printf("[");for (int i = mp[n]; i < (int)data.size(); i++) {printf("%d", data.at(i));}printf("]\n");break;} else {//否则加入mp[n] = t++;}}
}int main(void) {solve();return 0;
}

【蓝桥杯】有理数的循环节相关推荐

  1. java实现第四届蓝桥杯有理数类

    有理数类 题目描述有理数就是可以表示为两个整数的比值的数字.一般情况下,我们用近似的小数表示.但有些时候,不允许出现误差,必须用两个整数来表示一个有理数.这时,我们可以建立一个"有理数类&q ...

  2. 蓝桥杯java历年真题及答案整理(共100道题目及答案)

    文章目录 1.字符排序 2.串的简单处理 3.猜算式 4.Excel地址转换 5.手机尾号评分 6.括号问题 7.扑克牌排列 8.第一个数字(数字的值返回) 9.放麦子 10.求21位数的水仙花数 1 ...

  3. 蓝桥杯2013-2016真题

    javaB组蓝桥杯省赛历年真题(23-16) 文章目录 历年真题 第一次蓝桥杯百校真题大联赛 尺取法 概念 反向扫描 同向扫描 真题 2013年真题 一.世纪末的星期 二.马虎的算式 三.振兴中华 四 ...

  4. 蓝桥杯历年真题,来,看看

    .标题: 世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月3 ...

  5. 2015年 第6届 蓝桥杯 Java B组 省赛解析及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  6. 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数

    2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...

  7. 第十三届蓝桥杯大赛软件赛决赛(Java 大学C组)

    蓝桥杯 2022年国赛真题 Java 大学C组 试题 A: 斐波那契与 7 试题 B: 小蓝做实验 试题 C: 取模 试题 D: 内存空间 试题 E: 斐波那契数组 试题 F: 最大公约数 试题 G: ...

  8. 列表排序-第14届蓝桥杯STEMA测评Scratch真题精选

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第108讲. 蓝桥杯选拔赛现已更名为STEMA,即ST ...

  9. 第六届蓝桥杯大赛个人赛省赛Java B组真题

    文章目录 第六届蓝桥杯大赛个人赛省赛Java B组真题 1. 三角形面积(结果填空) 2. 立方自变身(结果填空) 3. 三羊献瑞(结果填空) 4. 循环节长度(代码填空) 5. 九数组分数(代码填空 ...

最新文章

  1. 监听指定端口数据交互(HttpListenerContext )
  2. Windows 2008 部署服务之Windows 7 应答文件创建
  3. Sqoop导入导出的时候总是出现等待5分钟的问题解决办法
  4. python在工程管理专业的应用案例_工程项目管理软件应用案例(精)
  5. python cms tornado_都2020年了,python的tornado框架还有用武之力么?
  6. Maven学习记录之maven基本操作命令,maven本地工厂的创建,maven骨架的生成,以及在eclipse中创建maven工程:...
  7. 为什么我们要使用HTTP Strict Transport Security?
  8. require.js使用(一)
  9. cpu计算速度排行榜_CPU速度的计算方法和单位
  10. python多个矩阵横向连接
  11. php array函数 array_search 搜索键值, 返回键名
  12. 第三方支付3(易宝支付)
  13. 【Servlet:Java Web服务器】JSP 基本知识点与总结 (思维导图)
  14. 计算机科学导论佛罗赞第4版,计算机科学导论 原书第4版
  15. 荣之学:关于跨境电商shopee平台,你了解多少?
  16. 这三种研发工程师千万不能招?
  17. 在这个“未来工厂”里, 人类仅凭脑电波控制机器
  18. Postgresql skip locked跳过行锁消除行锁冲突等待
  19. 支付系统实时交易流水监控设计
  20. Kafka教程(三):原理及存储

热门文章

  1. .NetCore——Autofac使用
  2. mac m1 prometheus安装与启动
  3. 弘辽科技:如何获取淘宝推广链接?有哪些推广方法?
  4. 单源最短路径的迪克斯特拉(Dijkstra)算法
  5. jpg图片转换为eps_如何将JPG图像转换为EPS
  6. 一阶电路的零状态响应
  7. SVN教程——02TortoiseSVN的使用
  8. 意想不到,这个神奇的bug让我加班到深夜
  9. 【Java】检查二叉树是否平衡。
  10. oracle 转义 039,案例:Oracle报错ORA-19583 ORA-27206 ORA-06512