题目:寻找某两个数相除,其结果离黄金分割点 0.618最近
要求:
- 分母和分子不能同时为偶数;
- 分母和分子取值范围在[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=fenmufenzi;high=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