题解 P2399 【non hates math】

· · 题解

蒟蒻我编程一窍不通,数学却略知一二

还是能用哪一丢丢数学知识来招架此题。(也许吧)

1.有限小数(没有循环节):1.125

小数点后的/小数点后的位数*10 。

2.纯循环小数:1.(3)

循环节/有几位写几个9

3.混循环小数:1.1(6)

小数点后所有-不循环部分/循环节有几位写几个9,不循环部分有几位添几个0。

最后还有很重要的一项:

约分!!!

上代码(终于.......)

蒟蒻代码,极其冗长,敬请谅解。

#include<bits/stdc++.h>//万能脑袋
using namespace std;
int t,k;
char s[1005];//小数点和小数点后用CHAR读入
int a[1005];//把CHAR化为INT
int ys(int m,int n)//约分,就是求最大公因数
{
   int r;
   r = m%n;  
   while(r!=0)
   {        
    m = n;
        n = r;
        r = m%n;
   }
   //辗转相除
   return n;
}
bool yx()//判断是否有循环节
{
    for(int i=1;i<=strlen(s);i++)
    {
        if(s[i]=='(')
        {
            return false;
        }
    }
    return true;
}
int main()//低调的主晗二叉树
{
    cin>>t; //整数部分
    cin>>s;//小数部分
    for(int i=1;i<=strlen(s);i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            k++;
            a[k]=s[i]-'0';//将小数点后变成INT
        }
    }
    if(yx()==true)//没有循环节
        int fm=pow(10,k);
        int fz=a[1];
        for(int i=2;i<=k;i++)
        {
            fz=fz*10+a[i];
        }//分子用INT
        fz=fz+t*fm;//带分数化成假分数
        cout<<fz/ys(fz,fm)<<'/'<<fm/ys(fz,fm);
    }
    if(yx()==false)//有循环节
    {
        if(s[1]=='(')//纯循环
        {
            int sum=0;//循环节的位数
            for(int i=2;;i++)
            {
                if(s[i]==')')
                {
                    break;
                }
                sum++;
            }
            int fm=pow(10,sum)-1;
            int fz=a[1];
            for(int i=2;i<=sum;i++)
            {
                fz=fz*10+a[i];
            }
            fz=fz+t*fm;
            cout<<fz/ys(fz,fm)<<'/'<<fm/ys(fz,fm);
        }
        else//混循环
        {
            int p;//记录循环节的起始
            int sum1=0;//不循环位数
            int sum2=0;//循环位数
            for(int i=1;;i++)
            {
                if(s[i]=='(')
                {
                    p=i;
                    break;
                }
                sum1++;
            }
            for(int i=p;;i++)
            {
                if(s[i]==')')
                {
                    break;
                }
                sum2++;
            }
            sum2-=1;
            int fm=(pow(10,sum2)-1)*(pow(10,sum1));
            int fz=a[1];//整体
            int fz1=a[1];//不循环部分
            for(int i=2;i<=sum2+sum1;i++)
            {
                fz=fz*10+a[i];
            }
            for(int i=2;i<=sum1;i++)
            {
                fz1=fz1*10+a[i];
            }
            fz=fz-fz1;//减去不循环部分
            fz=fz+t*fm;
            cout<<fz/ys(fz,fm)<<'/'<<fm/ys(fz,fm);
        }
    }
    return 0;//结束了,结束了,结束了!
}

本蒟蒻心地善良,代码中没有任何错误,复制提交可以直接AC,但蒟蒻建议:

非紧急情况不要用此功能!