有理逼近 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;
}
                


















