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: 输入 ...
随机推荐
- 6_1.springboot2.x整合JDBC与数据源配置原理解析
1.引言 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置.引入各种xxxTemplate,x ...
- Newtonsoft.Json高级篇:TypeNameHandling设置
原文:Newtonsoft.Json高级篇:TypeNameHandling设置 此示例使用TypeNameHandling 设置在序列化JSON和读取类型信息时包含类型信息,以便在反序列化JSON时 ...
- C 遍历目录及其子目录
遍历某一目录,获取该目录下所有文件路径的数组 #include <iostream> #include <dirent.h> #include <vector> v ...
- 13-2-return
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- (转)nginx配置location总结及rewrite规则写法
注: rewrite 只能对域名后边的除去传递的参数外的字符串起作用,并且要写全域名后面的部分,如: http://i.com:9090/php/midou/admin.php/index/login ...
- 【9.14NOIP模拟pj】wtaxi 题解
[9.14NOIP模拟pj]wtaxi 搜索
- thinkphp 区间查询
ThinkPHP支持对某个字段的区间查询,例如: 富瑞华大理石平台厂家哪家好 $map['id'] = array(array('gt',1),array('lt',10)) ; 得到的查询条件是: ...
- g2o学习资料
g2o下载:https://github.com/RainerKuemmerle/g2o/tree/9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a g2o的基本框架结 ...
- nginx源码分析——内存池
内存池的目的就是管理内存,使回收内存可以自动化一些. ngx_palloc.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. * ...
- 第一周课堂笔记4th
1. if 对应着程序设计中的三种程序执行流程: 顺序结构,一条一条的按顺序执行,自上而下 选择结构,if else 单分支,双分支,多分支 循环结构 while for (后面学) 流程控制 ...