ACM--Expanding Fractions

来源:互联网 发布:手机淘宝扫一扫 编辑:程序博客网 时间:2024/04/30 07:36

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

Sample Input

3 7345 800112 99053 1220 0

Sample Output

.428571The last 6 digits repeat forever..43125This expansion terminates..113The last 2 digits repeat forever..4344262295081967213114754098360655737704918032786885245901639The 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;}


0 0
原创粉丝点击