UVa 202 - Repeating Decimals(AC)

来源:互联网 发布:智能语音翻译软件 编辑:程序博客网 时间:2024/06/01 10:35

题目网址: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;}

0 0
原创粉丝点击