您的位置:首页 > 其它

ACM--Expanding Fractions

2015-07-12 20:22 218 查看
简略描述:求循环小数的循环节

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: