洛谷 P1530 分数化小数 Fractions to Decimals

题意:将分数化小数,也就是分子除以分母的值,难点在于循环节的判断以及竖式的模拟,送上题解

#include<bits/stdc++.h>
using namespace std;
int a,d;
int ok=1;
int p[1010000];
int k[1010000];
int main() 
{
    //freopen("fracdec.in","r",stdin);
    //freopen("fracdec.out","w",stdout);
    cin>>a>>d;
    int ans=0;//小数部分的位数 
    int q=1;//小数点要算位数 
    int u=a/d;//整数部分
    cout<<u<<"."; 
    if(u==0) ++q;//特判 0 
    while(u)
    {
        u/=10;
        q++;
    }//判断整数部分的位数,后面要用 
    a%=d;
    int t=10;//记录是否有循环节 
    while(a||ans<1)
    {
        a*=10;
        k[a]++;//记录出现次数 ,通过被除数(前一次做完后的余数)比较 
        if(k[a]>1) 
        {
            t=a/d;
            ok=0;
            break;
        }//遇到循环节跳出,记录 
        p[++ans]=a/d;
        a%=d;
    }//数论模拟,小学生竖式法 
    for(int i=1;i<=ans;++i)
    {
        if(p[i]==t) cout<<"(",t=-1,++q;//在第一个搜到的循环加括号 
        cout<<p[i];
        if((i+q)%76==0) cout<<endl;//换行 ,q是要算上在小数部分前的位数 
    }

    if(t<10) cout<<")";//如果t的初值改变 
    cout<<endl;
    return 0;
}

 

posted @ 2022-02-12 16:03  LikC1606  阅读(66)  评论(0)    收藏  举报