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(模拟)的更多相关文章

  1. 洛谷P1530 分数化小数 Fractions to Decimals

    P1530 分数化小数 Fractions to Decimals 103通过 348提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目 ...

  2. YTU 1439: 2.4.5 Fractions to Decimals 分数化小数

    1439: 2.4.5 Fractions to Decimals 分数化小数 时间限制: 1 Sec  内存限制: 64 MB 提交: 194  解决: 13 题目描述 写一个程序,输入一个形如N/ ...

  3. [C++]2-5 分数化小数

    /* 分数化小数 输入正整数a,b,c,输出a/b的小数形式.精确到小数点后C位.a,b<=10^6,c<=10^6. 输入包含多组数据,结束标记为a=b=c=0 样例输入: 1 6 4 ...

  4. 分数化小数(decimal)

    分数化小数 ①我的程序 #include<iostream>using namespace std;int main(void){ int a,b,c,kase=0; while(scan ...

  5. 【USACO 2.4.5】分数化小数

    [描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式. 如果小数有循环节的话,把循环节放在一对圆括号中. 例如, 1/3 =0.33333333 写成0.(3), 4 ...

  6. 【u237】分数化小数

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式.如果小数有循环节的话,把 ...

  7. 分数化循环小数C++实现

    引言 前一阵做了一个有理数四则混合运算的程序(详见:用C++实现的有理数(分数)四则混合运算计算器),以分数形式呈现运算结果.这次添加以循环小数形式呈现运算结果的功能.例如: Please input ...

  8. Leetcode 166.分数到小数

    分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入: num ...

  9. Java实现 LeetCode 166 分数到小数

    166. 分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数. 如果小数部分为循环小数,则将循环的部分括在括号内. 示例 1: 输入 ...

随机推荐

  1. Git初次使用,记录自己看

    Git官网下载:https://git-scm.com/downloads 官网如果太慢,可以去这下载:http://www.wmzhe.com/soft-38801.html,注意选择如下图地址下载 ...

  2. 【颓废篇】easyx--2048

    整天待在机房是不是,一直保持学术的态度就比较的难啊~ 所以本蒟蒻就在学术之余学了些奇技淫巧,然后就写了一些奇奇怪怪的程序啊,比如让我们小组dalao们都颓得不亦乐乎的2048~~ 当然,2048的实现 ...

  3. openssl操作公私钥和加解密的一些常用命令

    生成公私钥实践: 生成私钥,这里以椭圆曲线secp256k1为例: openssl ecparam -name secp256k1 -genkey -out secp256k1-priv.pem #带 ...

  4. 第十章 Odoo 12开发之后台视图 - 设计用户界面

    本文将学习如何为用户创建图形化界面来与图书应用交互.我们将了解不同视图类型和小组件(widgets)之间的差别,以及如何使用它们来提供更优的用户体验. 本文主要内容有: 菜单项 窗口操作(Window ...

  5. wiki方法能在H5页面上

    1. wiki 方法能在h5网页上判断当前手机上是否安装了汽车之家app,有的话,打开软件,并且能跳到相应页面,没有安装的话,能跳到主软下载页面? Android有个 applink,但是不知道支持得 ...

  6. 杂项-公司:Oracle

    ylbtech-杂项-公司:Oracle 甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩.1989年正式进入中国市场.201 ...

  7. Appium环境安装步骤 + 代码验证环境是否成功

    1.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本. 如下图所示:   如果没有 ...

  8. TKmybatis的框架介绍及使用方法

    最近项目使用了SpringBoot+TKMytis框架,期间遇到一些问题,顺便记一下. 一.框架配置 配置的话非常简单,我用的是SpringBoot,直接引入: <dependency> ...

  9. Spring MVC 返回 xml json pdf 数据的配置方法

    <!-- Spring MVC 返回 xml 数据的配置方法 -->     <bean class="org.springframework.web.servlet.vi ...

  10. Fiilter

    过滤器 过滤请求和响应 作用:        自动登录.        统一编码.        过滤关键字        .... Filter是一个接口 编写filter步骤: 1.编写一个类 a ...