1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者