题解 P2399 【non hates math】
FCB_Yiyang2006✈ · · 题解
蒟蒻我编程一窍不通,数学却略知一二
还是能用哪一丢丢数学知识来招架此题。(也许吧)
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,但蒟蒻建议: