假期训练—— Repeating Decimals UVA - 202 模拟

来源:互联网 发布:控制台运行java程序 编辑:程序博客网 时间:2024/05/01 18:27


题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=138


解题思路:

模拟除法,在每一次进行除法运算时都会有一个被除数,如果两次被除数相同,则遇到一个循环节,

通过判断其出现位置,解题。


代码如下:

#include <iostream> #include <cstdio>#include <cstdlib>#include <cmath>#include <iomanip>#include <algorithm>#include <climits>#include <cstring>#include <string>#include <set>#include <map>#include <queue>#include <stack>#include <vector>#include <list>#define rep(i,m,n) for(int i=m;i<=n;i++)#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)const int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define pb push_back#define mp make_pair#define fi first#define se second#define pi acos(-1.0)#define pii pair<int,int>#define Lson L, mid, rt<<1#define Rson mid+1, R, rt<<1|1const int maxn=5e2+10;using namespace std;typedef  long long ll;typedef  unsigned long long  ull; inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}//#pragma comment(linker, "/STACK:102400000,102400000")ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}typedef  vector<int> vi;int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};const int N = 1e7+5;int a,b;string re;int head1;int c[N];int index1[N];int aa,bb;int main(){while(cin >> a>>b){aa = a;bb = b;memset(c,0,sizeof(c));memset(index1,0,sizeof(index1));re.clear();head1 = a/b;a %= b;int ind1,ind2;while(1){if(c[a]){ind1 = index1[a];ind2 = re.size()-1;break;}else{c[a]++;index1[a] = re.size()-1;}a*=10;re += a/b+'0';a %= b;}//cout << re<<endl;int ctt = 0;int fff = 0;cout << aa<<"/"<<bb<<" = "<<head1<<".";for(int i=0;i<=ind1;i++){cout << re[i];}cout << "(";for(int i=ind1+1;i<=ind2;i++){ctt++;cout << re[i];if(ctt>=50){fff = 1;break;}}if(fff){cout <<"...";}cout <<")"<<endl;cout <<"   "<< ind2-ind1<<" = number of digits in repeating cycle"<<endl<<endl;}return 0;} 


0 0
原创粉丝点击