有理逼近 C++详解
- 有理逼近
- 问题描述
- 输入输出格式
- 输入格式
- 输出格式
- 输入输出样例
- 输入样例
- 输出样例:
- 解法+代码
- 代码
- 解法
- 变量解析
- 算法
注:本文支持互3~
有理逼近
问题描述
输入输出格式
输入格式
输入文件的第一行为 P 、 N P、N P、N,其中 P 、 N < 30000 P、N<30000 P、N<30000。
输出格式
输出文件只有一行,格式为“ X / Y X/Y X/Y U / V U/V U/V”,注意: X / Y X/Y X/Y与 U / V U/V U/V之间有一个空格,答案必须是既约的,也就是说分子、分母的最大公约数必须等于 1 1 1。
输入输出样例
输入样例
5 100
输出样例:
38/17 85/38
解法+代码
代码
这里先把代码放出来,然后一步一步讲解:
#include <bits/stdc++.h>
using namespace std;
long double sm=-1,bi=0x7fffffff,mi;
int n,m,a,b,p,q,i,kk;
int main()
{
cin >>n >>m; mi=sqrt(n);
for (i=1;i<=m;i++)
{
kk=int(i*mi);
if (kk>m)
break;
if (kk*1.0/i>sm)
{
sm=kk*1.0/i;
a=kk;
b=i;
}
if (kk>=m)
break;
if ((kk+1)*1.0/i<bi)
{
bi=(kk+1)*1.0/i;
p=kk+1;
q=i;
}
}
printf ("%d/%d %d/%d",a,b,p,q);
return 0;
}
解法
变量解析
long double sm=-1,bi=0x7fffffff,mi;
int n,m,a,b,p,q,i,kk;
s
m
sm
sm代表比较小的分数,
b
i
bi
bi代表比较大的那个分数;
m
i
mi
mi表示输入的数的算术平方根
n
n
n,
m
m
m代表输入的两个数;
a
a
a,
b
b
b,
p
p
p,
q
q
q分别表示两个分数的分子和分母;
i
i
i是循环变量,代表 临时分母
k
k
kk
kk代表 临时分子。
算法
通过带有注释的程序来介绍算法
#include <bits/stdc++.h>
using namespace std;
long double sm=-1,bi=0x7fffffff,mi;
int n,m,a,b,p,q,i,kk;
int main()
{
cin >>n >>m; mi=sqrt(n); //计算算术平方根
for (i=1;i<=m;i++) //枚举分母
{
kk=int(i*mi);
//计算出最为接近的两个分子,一个为kk,一个为kk+1,因为int是向下取整
if (kk>m) //最大不能超过m
break;
if (kk*1.0/i>sm)
//当分子为kk时,由于向下取整,所以一定小于算术平方根。
//这里在小于算术平方根的情况下取最大,才能最接近
{
sm=kk*1.0/i;
a=kk;
b=i;
}
if (kk>=m) //下面时kk+1的情况,所以不能等于m(+1后会大于m)
break;
if ((kk+1)*1.0/i<bi)
//同上
{
bi=(kk+1)*1.0/i;
p=kk+1;
q=i;
}
}
printf ("%d/%d %d/%d",a,b,p,q);
return 0;
}