分数化循环小数(纯/混)
网上看到这个问题,查了一下除了字符串查找没看到别的解法,自己写了一个,要考虑一些特殊情况,比如除0,负数等等,时间复杂度n^2,小数点长度N大于一万就慢了,感觉哪里还能再优化一下,最多跑过11111111/59595961,一共591万位,release要跑20秒5G内存,再大内存就不够了。
写的乱七八糟的,不写点注释以后估计自己都看不懂。
#include <iostream>
#include <vector>
using namespace std;
int main() {int upperLimit = 10;//小数点位数上限,当达到上限仍未找到循环节时乘以三继续寻找。int loopLen = 1;//循环节长度__int64 num;__int64 quotient;//商的整数部分__int64 a, b;vector<int> rem;//remainder小数部分cin >> a >> b;if (b == 0) {cout << "Integer division by zero。"; ::system("pause"); return 0;}if (a == 0) {cout << "0"; ::system("pause"); return 0;}if (float(a) / float(b) < 0) cout << "-";//负数判断a = abs(a);b = abs(b);quotient = a / b;a -= quotient * b;while (upperLimit *= 3,1) {auto HPC = [&]() {//高精度除法,除至第upperLimit位while (rem.size() < upperLimit) {a *= 10;num = a / b;rem.push_back(num);a -= b * num;}};auto Validate = [&]() {//结果有可能为0.(11...112)类似情况,至少验证多一倍的长度加上100位//以确保不会得出0.(1)这种答案,当然存在有一百多位的0.(11...112)循环,但估计分子分母是写不下了upperLimit *= 2 + 100;HPC();int front = rem.size() - 2 * loopLen;int back = rem.size() - loopLen;for (int i = upperLimit / 2; i < upperLimit; i++) {if (rem[i] != rem[front + (i - front) % loopLen]) return false;}return true;};auto SearchRepetation = [&]() {HPC();for (; loopLen <= rem.size() / 3; loopLen++) {auto HasRepeat = [&]() {for (int index = 1; index <= loopLen; index++)if (rem[rem.size() - index] != rem[rem.size() - loopLen - index] || rem[rem.size()-index-loopLen]!= rem[rem.size() - index - 2*loopLen]) return false;//查找时确保循环节出现至少三次,其实两次就够了,更多次数也不能保证特殊情况,//主要靠上面的验证步骤。上面的Validate多出来的一倍和100位也可以合并到这里面。return true;};if (HasRepeat() && Validate()) {//确定结果,输出int front = rem.size() - 2 * loopLen;int back = rem.size() - loopLen;while (front > 0 && rem[front-1] == rem[back-1]) { front--; back--; }if (back - front == 1 && rem[front] == 0) {//无循环if (front != 0)cout << quotient << ".";else//整数情况cout << quotient;for (int i = 0; i < front; i++) {cout << rem[i];}}else {//有循环cout << quotient << ".";for (int i = 0; i < back; i++) {if (i == front)cout << "(";cout << rem[i];}cout << ")";}return true;}}return false;};if (SearchRepetation()) break;}::system("pause");
}
分数化循环小数(纯/混)相关推荐
- 分数化成有限小数的方法_分数化小数的方法|小数化分数题目
[www.520z-2.com - 话题作文] 小数由整数部分.小数部分和小数点组成.当测量物体时往往会得到的不是整数的数,古人就发明了小数来补充整数 小数是十进制分数的一种特殊表现形式.下面是小学生 ...
- usaco ★Fractions to Decimals 分数化小数
★Fractions to Decimals 分数化小数 写一个程序,输入一个形如 N/D 的分数(N 是分子,D 是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中.例如, ...
- 把 分数化为循环小数 和 把循环小数化为分数 的方法
今天学习了把分数化为循环小数,下面代码实现的功能是:输入m/n,如果m能被n整除,则直接输出商:否则,输出商以后再输出循环节. #include<cstdio> #include<c ...
- 1439: 2.4.5 Fractions to Decimals 分数化小数
1439: 2.4.5 Fractions to Decimals 分数化小数 时间限制: 1 Sec 内存限制: 64 MB 提交: 194 解决: 13 题目描述 写一个程序,输入一个形如N/ ...
- 分数小数互换图_重复控制器学习心得(二)——超前环节的分数化和校正因子的引入...
本文仅作为学习记录,欢迎各位提出宝贵建议 1.超前补偿环节的分数化 在上周我学习了分数阶RC的实现方式,无独有偶,超前补偿环节也可以应用插值的方式来近似分数阶补偿. 整数阶超前补偿的弊端主要有二: 一 ...
- 分数化小数(指定精度)
分数化小数(指定精度) #include <stdio.h> #include <iostream> #include <iomanip> using namesp ...
- PHP实现页面静态化、纯静态化及伪静态化
概念 php静态化分为:纯静态化 和 伪静态化: 纯静态化又分为:局部静态化 和 完全静态化 纯静态化:是把PHP生成的动态页面保存成静态的html文件,用户访问该静态页面,而不是用户每一次访问都重新 ...
- 20以内分数化小数表_初等数学33-百分数
百分数定义 百分数与小数.分数的相互转换 百分数的定义 百分数是一个分母为100的比值,用百分号%表示.例如:用模型表示57%,即100个方格中有57个上色的格子 57/100 再如,25%,3%,1 ...
- C++——分数化小数
File Name:T023.cpp 分数化小数 Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 3592, Total Submis ...
最新文章
- 创建新的apple id_Google是新的Apple吗?
- NLP机器翻译深度学习实战课程基础 | 深度应用
- STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
- 【原创】请不要对Boost Format使用Byte作为参数
- 诱导公式的本质【转载】
- Kali中搭建vulhub时镜像git失败
- CCF201509-3 模板生成系统(100分)
- CSS3渐变——gradient
- mysql索引红黑联盟_MySQL的索引
- 员工管理能力怎么提高?不妨使用现代工时表软件
- advStringGrid单元格文字垂直居中
- Bulma和 Tailwind功能比较
- 【C++】虚表与虚表指针,虚基类表与虚基类表指针
- Mysql-DQL基础查询
- matlab矩阵变成行向量,matlab中将一个矩阵按照行拼成一个行向量应该怎么输?
- 13、hive在启动beeline客户端时报错:User: xxx is not allowed to impersonate xxx
- 【数理统计】双因素方差分析
- 如何实现根据照片获取地理位置及如何防御照片泄漏地理位置
- java 抛出异常后,还会执行后面代码吗?
- 2022美容师(中级)考试题库及在线模拟考试
热门文章
- 信管1172-201711671226-WWY —JSP智能手机销售网后台设计
- 神经网络方法研究及应用,神经网络算法简单例子
- cv2.VideoCapture(0)无法打开usb摄像头问题
- 注册域名是什么意思?域名注册可以注册哪些域名?
- 轻松理解什么是渐进式web应用
- Android微信分享网络图片缩略图
- 苹果拒绝支持PWA,有损Web的未来
- 字符★字符型讲解★ASCII码(最全讲解,亿字干货)
- 砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(二)——界面介绍
- 图像边缘检测-Canny,Sobel等算子