问题 E: 【高精度】高精度分数
时间限制: 1 Sec 内存限制: 64 MB提交: 92 解决: 31
[提交] [状态] [讨论版] [命题人:]
题目描述
“人无远虑,必有近忧”是修罗王一直以来恪守的信条,为了以防万一,他在很久以前就将《魔法宝典》的全部信息编码为一个巨大无比的自然数,并在这个数前加一个0和小数点,使它变成一个分数。然后他在戒指上刻了一个记号,使记号的两端长度比等于这个分数。这样,虽然他在入狱时手上只带了一个戒指,但只要测量出戒指上记号的比值M/N,他就可以还原《魔法宝典》的全部信息。
现在的问题是:已知分数M/N,试计算M/N(0<M<N<100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号)。
现在的问题是:已知分数M/N,试计算M/N(0<M<N<100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号)。
输入
只有一行,即M/N,其中0<M<N<100。
输出
输出M/N的值,如为无限循环小数,则输出第一循环节及起止位置。
样例输入
17/97
样例输出
17/97=0.175257731958762886597938144329896907216494845360824742268041237113402061855670103092783505154639
from 1 to 96
提示
【输入样例2】
1/2
【输出样例2】
1/2=0.5
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,m,num[105],dev[105]; void init(){ } void solve(){ char t; while(cin>>m>>t>>n){ fill(num,0);fill(dev,0); cout<<m<<t<<n<<"=0."; num[m]=1;int k=-1; bool flag=true; range(i,1,104){ m*=10; dev[i]=m/n; m%=n; if(num[m]){ k=i+1; flag=false; break; } num[m]=i+1; if(num[0]){ k=i+1; break; } } range(i,1,k-1)cout<<dev[i]; cout<<endl; if(!flag)cout<<"from "<<num[m]<<" to "<<k-1<<endl; } } int main() { init(); solve(); return 0; }