Luogu P1530 分数化小数 Fractions to Decimals(模拟)
P1530 分数化小数 Fractions to Decimals
题意
题目描述
写一个程序,输入一个形如\(N/D\)的分数(\(N\)是分子,\(D\)是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。
例如,\(1/3=0.33333333\)写成\(0.(3)\),\(41/333=0.123123123...\)写成\(0.(123)\),用\(xxx.0\)等表示整数。典型的转化例子:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
PROGRAM NAME fracdec
输入输出格式
输入格式:
单独的一行包括被空格分开的\(N\)和\(D(1 \leq N,D \leq 100000)\)。
输出格式:
按照上面规则计算出的小数表达式.如果结果长度大于\(76\),每行输出\(76\)个字符.
输入输出样例
输入样例:
45 56
输出样例:
0.803(571428)
说明
USACO 2.4
思路
来,\(solo\)!P1530。 --alecli & Mercury
来咧。 --Uranus
换题了换题了。 --alecli & Mercury & Uranus
昨天晚上的\(solo\)水题,但是巨佬们都不做了,只有我写了\(qwq\)。
实际上思路是很简单的,首先处理小数点左边的数字,直接取\(\lfloor n/d \rfloor\)就好了。然后我们用竖式除法的方式来模拟处理循环节,对于每一位上的运算,假设当前算出来结果是\(a\),余数为\(b\),我们就查找前面的运算过程中有没有结果是\(a\)且余数为\(b\)的,如果有,循环节就找到了。当然我们还要处理整除的情况,这就只需要判断\(b=0\)是否为真。
具体来说我们可以这么写:
while(n!=0)//循环利用n来做b
{
n*=10;//计算下一位
tmp=n/d;//这一位上的计算结果a
n-=tmp*d;//余数b
bool found=false;//打标记看能不能找到循环节
for(int i=0;i<G[tmp].size();i++)//G是一个vector,里面储存的是pair<int,int>,first储存余数,second储存出现的位置
if(G[tmp][i].first==n)//找到了
{
found=true;//修改标记
int now=G[tmp][i].second;//找到位置
string re;//处理新字符串(之前的运算结果都储存在字符串ans中)
for(int j=0;j<now;j++) re+=ans[j];//处理循环节之前的
re+='(';//循环节开始
for(int j=now;j<ans.length();j++) re+=ans[j];//处理循环节内部的
re+=')';//循环节结束
ans=re;//更新答案
break;//溜了溜了
}
if(found) break;//找到了,溜了溜了
ans+=(tmp+'0');//更新答案
G[tmp].push_back(make_pair(n,ans.length()-1));//更新vector
}
再处理好一些细节,就能\(AC\)了。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int n,d;
vector<PII>G[10];
string ans;
int read()
{
int re=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
string to_str(int x)
{
if(!x) return "";
string re=to_str(x/10);
re+=(x%10+'0');
return re;
}
int main()
{
cin>>n>>d;
int tmp=n/d;
n-=tmp*d;
ans+=to_str(tmp);
if(!ans.length()) ans+='0';
ans+='.';
while(n!=0)
{
n*=10;
tmp=n/d;
n-=tmp*d;
bool found=false;
for(int i=0;i<G[tmp].size();i++)
if(G[tmp][i].first==n)
{
found=true;
int now=G[tmp][i].second;
string re;
for(int j=0;j<now;j++) re+=ans[j];
re+='(';
for(int j=now;j<ans.length();j++) re+=ans[j];
re+=')';
ans=re;
break;
}
if(found) break;
ans+=(tmp+'0');
G[tmp].push_back(make_pair(n,ans.length()-1));
}
if(ans[ans.length()-1]=='.') ans+='0';
for(int i=0;i<ans.length();i++)
{
putchar(ans[i]);
if(i%76==75) puts("");
}
return 0;
}
Luogu P1530 分数化小数 Fractions to Decimals(模拟)的更多相关文章
- 洛谷P1530 分数化小数 Fractions to Decimals
P1530 分数化小数 Fractions to Decimals 103通过 348提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目 ...
- YTU 1439: 2.4.5 Fractions to Decimals 分数化小数
1439: 2.4.5 Fractions to Decimals 分数化小数 时间限制: 1 Sec 内存限制: 64 MB 提交: 194 解决: 13 题目描述 写一个程序,输入一个形如N/ ...
- [C++]2-5 分数化小数
/* 分数化小数 输入正整数a,b,c,输出a/b的小数形式.精确到小数点后C位.a,b<=10^6,c<=10^6. 输入包含多组数据,结束标记为a=b=c=0 样例输入: 1 6 4 ...
- 分数化小数(decimal)
分数化小数 ①我的程序 #include<iostream>using namespace std;int main(void){ int a,b,c,kase=0; while(scan ...
- 【USACO 2.4.5】分数化小数
[描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中. 例如, 1/3 =0.33333333 写成0.(3), 4 ...
- 【u237】分数化小数
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式.如果小数有循环节的话,把 ...
- 分数化循环小数C++实现
引言 前一阵做了一个有理数四则混合运算的程序(详见:用C++实现的有理数(分数)四则混合运算计算器),以分数形式呈现运算结果.这次添加以循环小数形式呈现运算结果的功能.例如: Please input ...
- Leetcode 166.分数到小数
分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入: num ...
- Java实现 LeetCode 166 分数到小数
166. 分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入 ...
随机推荐
- 2019-8-30-WPF-一个性能比较好的-gif-解析库
title author date CreateTime categories WPF 一个性能比较好的 gif 解析库 lindexi 2019-08-30 08:59:45 +0800 2018- ...
- adb 使用记录
127.0.0.1:21503 adb kill -server adb start -server adb devices adb logcat | fing "cocos" a ...
- win7 删除多余启动项的方法
win7已经没有像xp那么简单的boot.ini让我们修改了,取而代之的是bcdedit.现在就简单的说下bcdedit的常规应用吧.开始,运行,输入bcdedit /?可以看到帮助.简单的应用开始. ...
- pixi.js 学习
事件(event):PIXI库在精灵和舞台上提供了事件,用于交互. stage.click = function(data){ var event = data.originalEvent } sp ...
- 最棒的7种R语言数据可视化
最棒的7种R语言数据可视化 随着数据量不断增加,抛开可视化技术讲故事是不可能的.数据可视化是一门将数字转化为有用知识的艺术. R语言编程提供一套建立可视化和展现数据的内置函数和库,让你学习这门艺术.在 ...
- java基础之完数判断
完数: 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该 ...
- Django的日常-视图层
目录 Django的日常-3 JsonResponse form表单上传文件 CBV的源码分析 视图层 模板传值 过滤器 标签 自定义过滤器和标签 Django的日常-3 JsonResponse 在 ...
- 抓包:MySQL Sniffer
1.依赖文件安装 依赖glib2-devel.libpcap-devel.libnet-devel [root@VMUest ~]# yum install cmake [root@VMUest ~] ...
- HDU--2639 Bone Collector II(01背包)
题目http://acm.hdu.edu.cn/showproblem.php?pid=2639 分析:这是求第K大的01背包问题,很经典.dp[j][k]为背包里面装j容量时候的第K大的价值. 从普 ...
- docker上构建redis容器
1.查看docker上的镜像 [root@holly ~]# docker images 2.搜索docker上的redis镜像,选择下载的版本 [root@holly ~]# docker sear ...