USACO2.4Fractions to Decimals(fracdec)

        模拟除法运算,利用数组ch[]保存商值,使用post[n]表示余数n除以d的商出现在ch[]中的位置(未出现过为-1),不必再每次对出现的商s进行检测,节约大量时间。循环进行除法运算,如果余数n出现过即为循环小数,n为零则为有限非循环小数。然后均终止除法运算,按照要求输出结果即可。

 

/*
ID:jzzlee1
PROB:fracdec
LANG:C++
*/
//#include <iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream cin("fracdec.in");
ofstream cout("fracdec.out");
int e,t;
int post[100001];
char ch[100010];
void cal(int a)
{
	int i=0;
	do
	{
		i++;
		a=a/10;
	}
	while(a);
	i=i+2;;
	e=t=i;
}
int main()
{
	int i,n,d,a,s,flag=0,count=0;
	cin>>n>>d;
	if(n%d==0)//整除
		cout<<n/d<<".0"<<endl;
	else
	{
		memset(post,-1,sizeof(post));
		a=n/d;n%=d;
		cal(a);
		while(1)
		{
			if(n==0)
			{
				flag=1;
				break;
			}
			if(post[n]==-1)
			{
				post[n]=t++;
				s=10*n/d;
				ch[post[n]]=s+'0';
				n=10*n%d;
			}
			else 
			{
				flag=2;
				break;
			}
		}
		cout<<a<<".";
		if(flag==1)
		{
			for(i=e;i!=t;i++)
			{
				cout<<ch[i];
				if(i%76==0)
					cout<<endl;
			}
			if((t-1)%76!=0)
				cout<<endl;
		}
		else if(flag==2)
			{
				for(i=e;i<post[n];++i)
				{
					cout<<ch[i];
					if(i%76==0)
					cout<<endl;
				}
				cout<<'(';
				i++;
				if(i%76==0)
					cout<<endl;
				t++;
				for(;i<t;++i)
				{
					cout<<ch[i-1];
					if(i%76==0)
						cout<<endl;
				}
				cout<<')';
				cout<<endl;
			}
	}
	return 0;
}

转载于:https://my.oschina.net/u/347565/blog/64490

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值