P1530 分数化小数 Fractions to Decimals

题意

题目描述

写一个程序,输入一个形如\(N/D\)的分数(\(N\)是分子,\(D\)是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。

例如,\(1/3=0.33333333\)写成\(0.(3)\),\(41/333=0.123123123...\)写成\(0.(123)\),用\(xxx.0\)等表示整数。典型的转化例子:

  1. 1/3 = 0.(3)
  2. 22/5 = 4.4
  3. 1/7 = 0.(142857)
  4. 2/2 = 1.0
  5. 3/8 = 0.375
  6. 45/56 = 0.803(571428)
  7. PROGRAM NAME fracdec

输入输出格式

输入格式:

单独的一行包括被空格分开的\(N\)和\(D(1 \leq N,D \leq 100000)\)。

输出格式:

按照上面规则计算出的小数表达式.如果结果长度大于\(76\),每行输出\(76\)个字符.

输入输出样例

输入样例:

  1. 45 56

输出样例:

  1. 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\)是否为真。

具体来说我们可以这么写:

  1. while(n!=0)//循环利用n来做b
  2. {
  3. n*=10;//计算下一位
  4. tmp=n/d;//这一位上的计算结果a
  5. n-=tmp*d;//余数b
  6. bool found=false;//打标记看能不能找到循环节
  7. for(int i=0;i<G[tmp].size();i++)//G是一个vector,里面储存的是pair<int,int>,first储存余数,second储存出现的位置
  8. if(G[tmp][i].first==n)//找到了
  9. {
  10. found=true;//修改标记
  11. int now=G[tmp][i].second;//找到位置
  12. string re;//处理新字符串(之前的运算结果都储存在字符串ans中)
  13. for(int j=0;j<now;j++) re+=ans[j];//处理循环节之前的
  14. re+='(';//循环节开始
  15. for(int j=now;j<ans.length();j++) re+=ans[j];//处理循环节内部的
  16. re+=')';//循环节结束
  17. ans=re;//更新答案
  18. break;//溜了溜了
  19. }
  20. if(found) break;//找到了,溜了溜了
  21. ans+=(tmp+'0');//更新答案
  22. G[tmp].push_back(make_pair(n,ans.length()-1));//更新vector
  23. }

再处理好一些细节,就能\(AC\)了。

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> PII;
  4. int n,d;
  5. vector<PII>G[10];
  6. string ans;
  7. int read()
  8. {
  9. int re=0;
  10. char ch=getchar();
  11. while(!isdigit(ch)) ch=getchar();
  12. while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
  13. return re;
  14. }
  15. string to_str(int x)
  16. {
  17. if(!x) return "";
  18. string re=to_str(x/10);
  19. re+=(x%10+'0');
  20. return re;
  21. }
  22. int main()
  23. {
  24. cin>>n>>d;
  25. int tmp=n/d;
  26. n-=tmp*d;
  27. ans+=to_str(tmp);
  28. if(!ans.length()) ans+='0';
  29. ans+='.';
  30. while(n!=0)
  31. {
  32. n*=10;
  33. tmp=n/d;
  34. n-=tmp*d;
  35. bool found=false;
  36. for(int i=0;i<G[tmp].size();i++)
  37. if(G[tmp][i].first==n)
  38. {
  39. found=true;
  40. int now=G[tmp][i].second;
  41. string re;
  42. for(int j=0;j<now;j++) re+=ans[j];
  43. re+='(';
  44. for(int j=now;j<ans.length();j++) re+=ans[j];
  45. re+=')';
  46. ans=re;
  47. break;
  48. }
  49. if(found) break;
  50. ans+=(tmp+'0');
  51. G[tmp].push_back(make_pair(n,ans.length()-1));
  52. }
  53. if(ans[ans.length()-1]=='.') ans+='0';
  54. for(int i=0;i<ans.length();i++)
  55. {
  56. putchar(ans[i]);
  57. if(i%76==75) puts("");
  58. }
  59. return 0;
  60. }

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. <小知识>记录

    lis = [2,3,"k",["qwe",20,["k1",["tt",3,"1"]],89],& ...

  2. Java核心-01 谈谈你对Java平台的理解

    今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个.一是所谓的“书写一次,到处运行”,能够非 ...

  3. AtCoder F - Exhausted?

    传送门 sxy题解: //Achen #include<algorithm> #include<iostream> #include<cstring> #inclu ...

  4. 19-10-30-C

    交文件吼啊. ZJ一下: T1是真·高中数学. T2不是很清楚,只得了30. T3打了一个欧拉序. 做的海星的地方: Vim太好用辣,直接按平常打叫上去它就是 freopen T1仔仔细细的研究了高考 ...

  5. C#可扩展编程之MEF(五):MEF高级进阶

      好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较 ...

  6. VS2010-MFC(对话框:模态对话框及其弹出过程)

    转自:http://www.jizhuomi.com/software/160.html 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框是这样的对话 ...

  7. Ubuntu 安装gnome桌面及vnc远程连接

    安装gnome桌面 sudo apt-get install gnome-core 安装vnc sudo apt-get install vnc4server 启动vnc vncserver 设置一下 ...

  8. springmvc-@RequestBody无法映射首字母大写的属性

    @RequestBody可以将前台传入的json格式数据自动映射成对象,当如果属性的首字母大写,则会出现不能映射的情况,如: private String ICCID;会出现映射失败的情况 解决办法: ...

  9. springcloud(十):Hystrix工作流程分析

    通过Netflix Hystrix官方公布的流程图,我们来了解一下Hystrix的工作流程 1.创建HystrixCommand对象或者HystrixObservableCommand对象 首先创建一 ...

  10. Java基础知识(数据类型和集合)

    一.数据类型 包装类型 包装类型是对基本数据类型不足之处的补充. 基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法. Java1.5 以后可以自动装箱和拆箱 二 ...