ACM--Expanding Fractions

简略描述:求循环小数的循环节

Sample Input

3 7
345 800
112 990
53 122
0 0

Sample Output

.428571
The last 6 digits repeat forever.
.43125
This expansion terminates.
.113
The last 2 digits repeat forever.
.4344262295081967213114754098360655737704918032786
885245901639
The last 60 digits repeat forever.
//基本思想就是每除一次,看新的余数是否与前面的相等
//如112/990  余数分别为112 130 310 130,可知130与前面的相等了 
//故可知从此开始循环 
// 此题的陷阱为,50个就空一行。然而,第一个行的"."号不算,也就是 
//第一行输出49个,接下来每行50个。 
#include<iostream>
#include<string.h>
using namespace std;
int s[1001];//储存商 
int y[1001];//储存余数 
int main()
{
	int a,b;//a分子,b分母 
	int i,j;//i余数的指针 
	int k;
	while(cin>>a>>b,a&&b)
	{
      i=2;
      j=1;
	  memset(s,0,sizeof(s));
	  memset(y,0,sizeof(y));
	  int flag=0;
	  y[1]=a;
	  while(a)
	  {
	  	int exit=0;
  	    a*=10;
  	    s[j]=a/b;
  	    a=a%b;
  	    y[i]=a;
		if(!a)
		{
		  flag=1;break;	
		}	
		for(k=1;k<=i-1;k++)
		 if(y[k]==y[i])
		   {	   	
		   	exit=1;
		     break;	     	   
		   }
		  if(exit)
		    break; 
		  i++;
		  j++; 
	  }	
	  cout<<".";
	  if(flag)
	    {
	     for(int m=1;m<=j;m++)
	        cout<<s[m];
	     cout<<endl;
         cout<<"This expansion terminates."<<endl;	
		}	
	  else
	  {	  
       for(int m=1;m<=i-1;m++)
      {
          if(m==50||m > 51&&m%50==0)//被这条代码坑成狗啊!!!		    
		   cout<<endl;
		  cout<<s[m];
	  } 
	   cout<<endl;
       cout<<"The last "<<i-1-k+1<<" digits repeat forever."<<endl;
	  }
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值