usaco2.4.6分数化小数

思路是对的,只可惜判断循环小数的方法错了,我竟然一个一个比过去233,如果我好好用hash的话,这一题就秒过了,o(︶︿︶)o 唉,hash。。。。。。

#include<iostream>

#include <cmath>
#include <cstdio>
using namespace std;
int yushu[1000002],k=0,k1=0,k2=0;
struct aaa{bool a1;int wei;}hash[1000002];
void huanhuang(void);
int main()
{
  //freopen("fracdec.in","r",stdin);
  //freopen("fracdec.out","w",stdout);
  int n,shu;
  cin>>n>>shu;
  if(n<shu){cout<<0;
  huanhuang();}
  while(n>=shu){
    cout<<n/shu;
    int ll=n/shu,i;
    for(i=0;ll>0;i++)
        ll/=10;
    k+=i;
    n%=shu;
  }
  cout<<'.';
  huanhuang();
  if(n==0){cout<<0<<endl;return 0;}
  while(n!=0)
  {
      if(!hash[n].a1){yushu[++k1]=n;hash[n].a1=true;hash[n].wei=k1;}
      else {k2=hash[n].wei;break;}
      n=n*10%shu;
  }
  if(n==0){for(int i=1;i<=k1;i++){printf("%d",yushu[i]*10/shu);huanhuang();}
  cout<<endl;
  }
  else {
    for(int i=1;i<k2;i++)
        {printf("%d",yushu[i]*10/shu);huanhuang();}
  cout<<'(';
  huanhuang();
  for(int i=k2;i<=k1;i++)
    {printf("%d",yushu[i]*10/shu);huanhuang();}
  cout<<')'<<endl;
  }


return 0;
}
void huanhuang(void)
{
    k++;
    if(k==76){cout<<endl;k=0;}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值