挑战程序设计竞赛 2.6章习题 POJ 1930 Dead Fraction
https://vjudge.csgrandeur.cn/problem/POJ-1930
迈克在最后一刻拼命地赶着完成他的论文。在接下来的3天里,他需要将所有的研究笔记整理成较为连贯的形式。
不幸的是,他注意到他在计算方面非常粗心。每当他需要进行算术运算时,他只是将其输入计算器,并将他认为相关的答案写下来。
每当显示一个循环小数时,迈克只是简单地记录下前几位数字,然后加上“...”。例如,他可能会写下“0.3333...”而不是“1/3”。
不幸的是,他的结果需要精确的分数!他没有时间重新计算每个计算,所以他需要你写一个程序(而且要快!)来自动推断原始分数。
为了使这个过程可行,他假设原始分数总是产生给定数字序列的最简分数;他所说的最简是指分母最小的分数。
此外,他假设他没有忽略写下重要的数字;即使这个循环部分的小数展开全是零,也没有遗漏记录。
输入
有几个测试用例。对于每个测试用例,输入的一行是形如“0.dddd...”的字符串,其中dddd是由1到9个数字组成的,不能全为零。
最后一个用例后面跟着一行包含0的输入。
输出
对于每个用例,输出原始分数。
0.2...
0.20...
0.474612399...
0
2/9
1/5
1186531/2500000
0.308048647...
154024322/499999995
0.012345679...
1/81
0.1428571...
0.14285714...
0.142857142...
1/7
解答
循环数的规律
0.233233 这种循环就是 233/999 分母9的出现个数是循环节的长度
0.666233233233 这种循环就是 666233-666 / 999000 也就是整个数减去非循环节 然后除以999000
分母9的出现个数是循环节的长度 分母0出现的次数是非循环节的长度
但是题目 并不保证0.666233是以哪个循环节进行循环,所以要逐个尝试循环节,然后得到最简,也就是分母最小的分数。
另一种方法 见图
#include <iostream>
#include <string>
#include <limits>
#include <math.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
typedef unsigned long long ULL;
string str;
ULL nine(int len) {
return pow(10, len )-1;
}
ULL gcd(ULL a, ULL b)
{
return b ? gcd(b, a % b) : a;
}
void solve(string digit) {
ULL len = digit.size();
ULL mindown = numeric_limits<ULL>::max();
ULL minup = 0;
//得到整个数据
ULL a = atoi(digit.c_str());
for (int i = 1; i <= len; i++) {
//逐个尝试 循环节
ULL b = atoi(digit.substr(0, len - i).c_str());
//添加九位
ULL down = nine(i);
//添加零位
down *= pow(10, len - i);
//计算aa/a + bb/b
ULL up = a-b;
//通分分子分母
ULL d = gcd(up, down);
up = up / d; down = down / d;
if (mindown > down) {
mindown = down;
minup = up;
}
}
cout << minup << "/" << mindown << endl;
return;
}
int main()
{
#if 0
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
while (cin >> str) {
if (str == "0") break;
int len = str.length() - 5;
string digit = str.substr(2, len);
ULL n = atoi(digit.c_str());
if (n == 0) {
cout << "0/1" << endl;
continue;
}
solve(digit);
}
#if 0
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2021-04-04 Leetcode 39. 组合总和 dfs
2021-04-04 Leetcode 59. 螺旋矩阵 II
2021-04-04 Leetcode 61. 旋转链表
2016-04-04 zeromq学习记录(九)练习代码学习ZMQ_ROUTER ZMQ_READLER