试题 历届真题 循环小数【第十一届】【决赛】【研究生组】
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
思路
1.0.333之类(只有循环体)
0.333的循环体的个数为1(即是3),所以分子/分母为3/9=1/3
0.4242 循环体个数为2(42),分子/分母为 42/99…
2.0.1233443344之类(循环体前还有数字的)
0.1233443344=0.12+0.0033443344=12/100+3344/9999/100
通分之后(12 * 9999 + 3344)/(9999 * 100),再找最大公约数,约分之后就得到结果
代码:
#include <iostream>
#include<math.h>
using namespace std;
int getnumb(int a,int b)//得到最大公约数的函数
{
return b==0?a:getnumb(b,a%b);
}
int main()
{
int p,q,num;
cin>>p>>q>>num;
int x,y;//分子分母
int t2=pow(10,q-p+1);//循环前数对应的10的q-p+1次方
int t1=pow(10,p-1);//循环的数 对应的10的p-1次方
int numb1=num/t2;//循环前部分的数
int numb2=num%t2;//循环部分的数
x=numb1*(t2-1)+numb2;//通分后的分子
y=(t2-1)*t1;//分母
int numb=getnumb(x,y);//得到最大公约数,接下来化简x,y
x/=numb;
y/=numb;
cout<<x<<" "<<y<<endl;
return 0;
}
202205291524日