您的位置:首页 > 其它

USACO Section 2.3 Fractions to Decimals

2014-01-24 16:09 465 查看
题意:

已知分子分母  求  该数字的小数形式  要求如果是循环小数用()表示出循环节

思路:

不循环小数容易处理  循环小数需要找出哪里是循环节  想象笔算除法的方法可以知道

当被除数的状态再次出现  则表示进入循环  用此方法即可

记录状态时候数组开的大点(我还用了map来映射该状态对应的位置)

因为循环节不一定什么时候出现…  我不会算…


注意:

USACO对空格和回车也判断  一定要注意格式!!

代码;

/*
ID: housera1
PROG: fracdec
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define M 1000000

int tot,cir;
int ans[M];
map<int,int> mp;

int main(){
int Debug=0;
if(!Debug){
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
}
int i,up,dn,outi,tmp;
scanf("%d%d",&up,&dn);
tmp=up/dn;
up=up%dn;
printf("%d.",tmp);
if(!up)
{
printf("0\n");
return 0;
}
if(tmp>99999) outi=7;
else if(tmp> 9999) outi=6;
else if(tmp> 999) outi=5;
else if(tmp> 99) outi=4;
else if(tmp> 9) outi=3;
else outi=2;
mp.clear();
tot=1;
cir=-1;
while(up)
{
up*=10;
if(mp[up])
{
cir=mp[up];
break;
}
ans[tot]=up/dn;
mp[up]=tot;
tot++;
up%=dn;
}
if(cir<0)
{
for(i=1;i<tot;i++,outi++)
{
if(outi==76)
{
printf("\n");
outi=0;
}
printf("%d",ans[i]);
}
}
else
{
for(i=1;i<cir;i++,outi++)
{
if(outi==76)
{
printf("\n");
outi=0;
}
printf("%d",ans[i]);
}
if(outi==76)
{
printf("\n");
outi=0;
}
printf("(");
outi++;
for(;i<tot;i++,outi++)
{
if(outi==76)
{
printf("\n");
outi=0;
}
printf("%d",ans[i]);
}
if(outi==76)
{
printf("\n");
outi=0;
}
printf(")");
outi++;
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: