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: 输入 ...
随机推荐
- nodejs之连接mysql数据库
一:demo var mysql = require('mysql'); var connection = mysql.createConnection({ host : '192.16 ...
- PagedListCore的使用
关于在Core2.0中PagedListCore实现分页 一.引言 开发中在对大量数据展示的时候,出于对性能的考虑,我们往往是使用分页功能(用户需要那一页我们就返回给他那一页,而不是一次性加载所有的数 ...
- 02_mybatis开发dao的方法
MyBatis开发dao的方法 1. SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂Sql ...
- Spring 声明式事务管理(11)
案例分析 本案例是图书管理系统精简部分,在数据库中有3张表.分别保存图书库存.图书信息和用户信息.下面是建表SQL语句 1 DROP TABLE IF EXISTS store; 2 DROP TAB ...
- [WPF自定义控件库]使用WindowChrome自定义RibbonWindow
原文:[WPF自定义控件库]使用WindowChrome自定义RibbonWindow 1. 为什么要自定义RibbonWindow 自定义Window有可能是设计或功能上的要求,可以是非必要的,而自 ...
- selenium基础(脚本模块化)
selenium基础(脚本模块化)
- DES加密算法-C语言
头文件:DES.h #ifndef DES_hpp #define DES_hpp #include <stdio.h> #include <memory.h> #includ ...
- iOS逆向系列-逆向APP思路
界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...
- hudson通过ant自动编译、启动、停止java的jar
set ANT_PATH=E:\soft\apache_ant\bine:cd E:\data\codex\server\trunk\serversvn up @echo.@echo.@echo &q ...
- 以代码的方式管理quartz定时任务的暂停、重启、删除、添加等
[前言]在项目的管理功能中,对定时任务的管理有时会很常见.因为我们不能指望只在配置文件中配置好定时任务就行了,因为如果要控制定时任务的 “暂停” 呢?暂停之后又要在某个时间点 “重启” 该定时任务呢? ...