【java学习】寻找某两个数相除,其结果离黄金分割点 0.618最近

题目:寻找某两个数相除,其结果离黄金分割点 0.618最近

要求:

  1. 分母和分子不能同时为偶数;
  2. 分母和分子取值范围在[1-20]的整数;

分析:

1. 两数相除最接近0.618的结果有两种可能:res>=0.618或者res<0.618。因此,可以分别计算两种情况的分子和分母;

代码中命名分别为lowFenzi、lowFenmu;highFenzi、highFenmu;

res<0.618情况,两数相除结果为low;
res>=0.618情况,两数相除结果为high;

2. 对于每一个给定的分母,都存在最接近0.618的low和high,并且此时成立 l o w = f e n z i f e n m u ; h i g h = f e n z i + 1 f e n m u low = \frac{fenzi} {fenmu};high = \frac{fenzi+1}{fenmu} low=fenmufenzihigh=fenmufenzi+1

下面进行论证:给定分母 y y y,存在 x x x,使得 x y \frac{x}{y} yx满足low的定义。
假设 x + 1 y \frac{x+1}{y} yx+1不满足high的定义,那么存在两种情况不满足high的定义:a. x + 1 y < 0.618 \frac{x+1}{y}<0.618 yx+1<0.618;b. x + 1 y > 0.618 \frac{x+1}{y}>0.618 yx+1>0.618,但存在 z z z,使得 0.618 < z y < x + 1 y 0.618<\frac{z}{y}<\frac{x+1}{y} 0.618<yz<yx+1

a. x + 1 y < 0.618 \frac{x+1}{y}<0.618 yx+1<0.618

x + 1 y < 0.618 \frac{x+1}{y}<0.618 yx+1<0.618成立时,存在
x y < x + 1 y < 0.618 \frac{x}{y}<\frac{x+1}{y}<0.618 yx<yx+1<0.618
因此,与 x y \frac{x}{y} yx满足low定义的前提存在矛盾,故a.情况不存在。

b. x + 1 y > 0.618 \frac{x+1}{y}>0.618 yx+1>0.618,但存在 z z z,使得 0.618 < z y < x + 1 y 0.618<\frac{z}{y}<\frac{x+1}{y} 0.618<yz<yx+1

当存在 z z z,使得 0.618 < z y < x + 1 y 0.618<\frac{z}{y}<\frac{x+1}{y} 0.618<yz<yx+1时,同时x,z,x+1皆为整数,且 x y < 0.618 \frac{x}{y}<0.618 yx<0.618,即
x < z < x + 1 x<z<x+1 x<z<x+1
这与z为整数相矛盾,故b.情况不存在。
综上所述2.成立。

3. 定理2中满足low定义的 x i , y i x_{i}, y_{i} xi,yi,存在如下关系,当 y j > y i y_{j}>y_{i} yj>yi时, x j > = x i x_{j}>=x_{i} xj>=xi。即随着 y y y的取值增大, x x x的取值也会增大。

给定 y 1 < y 2 y_{1}<y_{2} y1<y2,相应得存在 x 1 , x 2 x_{1}, x_{2} x1,x2,即 x 1 y 1 < 0.618 \frac{x_{1}}{y_{1}}<0.618 y1x1<0.618 x 2 y 2 < 0.618 \frac{x_{2}}{y_{2}}<0.618 y2x2<0.618
假设 x 1 > x 2 x_{1}>x_{2} x1>x2,由于 x 2 y 2 \frac{x_{2}}{y_{2}} y2x2满足low的定义,即
x 1 y 1 > x 1 y 2 > = 0.618 > x 2 y 2 \frac{x_{1}}{y_{1}}>\frac{x_{1}}{y_{2}}>=0.618>\frac{x_{2}}{y_{2}} y1x1>y2x1>=0.618>y2x2
其中, x 1 y 1 > 0.618 \frac{x_{1}}{y_{1}}>0.618 y1x1>0.618与low的定义相矛盾。
因此, x 1 < = x 2 x_{1}<=x_{2} x1<=x2

java实现

public class goldRatio{
    public static void main(String[] args){
        int fenzi = 1;
        int fenmu = 2;
        int highFenmu = fenmu;
        int lowFenmu = fenmu;
        int highFenzi = fenzi + 1;
        int lowFenzi = fenzi;
        //寻找最佳的low和high
        while(fenmu <= 20 && fenzi <= 20){
            float ratio1 = (float) fenzi / fenmu;
            float ratio2 = (float) (fenzi + 1) / fenmu;
            if(ratio2 < 0.618){//分子增大
                fenzi++;
            }else if(ratio2 >= 0.618){//尝试更新low和high
                if(fenzi%2 == 0 && fenmu%2 == 0) {
                    fenmu++;
                    continue;
                }
                if(ratio1 > ((float) lowFenzi/lowFenmu)){//更新low的
                    lowFenzi = fenzi;
                    lowFenmu = fenmu;
                }
                if(ratio2 < ((float) highFenzi/highFenmu)) {//更新high
                    highFenzi = fenzi + 1;
                    highFenmu = fenmu;
                }
                fenmu++;
            }
        }//while
        //对比low和high
        float low = (float) lowFenzi/lowFenmu;
        float high = (float) highFenzi/highFenmu;
        if((0.618-low) > (high-0.618)){
            System.out.println("分子" + highFenzi + ",分母" + highFenmu);
        }else{
            System.out.println("分子" + lowFenzi + ",分母" + lowFenmu);
        }
    }
}

输出:分子8,分母13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值