题目网址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=138
解题的话模拟除法,出现两个相同的模(%b)的时候就出现了一个cycle。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
using namespace std;
int mod[3001]; // 记录每次对b取模之后的值的位置
int main()
{
int a, b;
while (cin >> a >> b)
{
for (int i = 0; i < 3001; i++)
mod[i]=-1;
string ans = "";
cout << a << '/' << b << " = ";
int div = a / b;
cout << div;
cout << '.';
int subs = a;
int first = -1, len = 1;
char ch = ' ';
while (1)
{
subs %= b;
if(mod[subs]==-1) mod[subs]=ans.size(); // 第一次出现某个 模 值
else // 出现cycle
{
len=ans.size()-mod[subs];// 记录cycle的长度
ch=div+48;
ans+=ch;
int i;
for( i= 1;i<=ans.size();i++)
{
if(mod[subs]==i-1) {
cout<<'(';
break;
}
if(ans[i]>='0'&&ans[i]<='9') cout<<ans[i];
}
int j=0;
for( i ; i<=ans.size()&&j<50;i++)
{
if(ans[i]>='0'&&ans[i]<='9') cout<<ans[i],j++;
}
if(len>50) cout<<"..."; //cycle长度超过50就要输出 ...了.
cout<<')'<<endl;
break;
}
ch=div+48;
ans += ch;
subs *= 10;
div = subs / b;
}
cout << " " << len << " = number of digits in repeating cycle\n";
}
// system("pause");
return 0;
}