【高精度】高精度分数

问题 E: 【高精度】高精度分数

时间限制: 1 Sec   内存限制: 64 MB
提交: 92   解决: 31
[ 提交] [ 状态] [ 讨论版] [命题人: ]

题目描述

“人无远虑,必有近忧”是修罗王一直以来恪守的信条,为了以防万一,他在很久以前就将《魔法宝典》的全部信息编码为一个巨大无比的自然数,并在这个数前加一个0和小数点,使它变成一个分数。然后他在戒指上刻了一个记号,使记号的两端长度比等于这个分数。这样,虽然他在入狱时手上只带了一个戒指,但只要测量出戒指上记号的比值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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Rhythm-/p/9348893.html