1 条题解

  • 0
    @ 2025-8-24 21:37:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar FCB_Yiyang2006✈
    **

    搬运于2025-08-24 21:37:16,当前版本为作者最后更新于2019-06-13 10:39:52,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

    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,但蒟蒻建议:

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

    • 1

    信息

    ID
    1421
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者