USACO2.4Fractions to Decimals(fracdec)

        模擬除法運算,利用數組ch[]保存商值,使用post[n]表示餘數n除以d的商出如今ch[]中的位置(未出現過爲-1),沒必要再每次對出現的商s進行檢測,節約大量時間。循環進行除法運算,若是餘數n出現過即爲循環小數,n爲零則爲有限非循環小數。而後均終止除法運算,按照要求輸出結果便可。ios

 

/*
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;
}
相關文章
相關標籤/搜索