20171223Java基础学习——编程题练习<黄金分割比>

[Q]寻找某两个数相除,其结果离黄金分割点 0.618最近。需满足:
分母和分子不能同时为偶数
分母和分子 取值范围在[1-20]
[A]:

public class HelloWorld{
    public static void main(String[] args) {
        float i, j, m = 0 , n = 0.0f, min = 1.0f, value;

        for(i = 1.0f; i <= 20.0; i++){
            for(j = i + 1; j <= 20.0; j++){//取值在0.618附近式,分数值必小于1,故分母>分子
                if(i % 2 != 0 || j % 2 != 0){//在分子分母不同时为偶数的前提下,再计算分数值
                    if(i / j > 0.618)value = i / j - 0.618f;
                    else value =  0.618f - i / j;//求分数值与黄金分割点的差值绝对值
                    if(value < min){//找出最小差值下的分子分母值
                        min = value;
                        m = i;
                        n = j;
                    }
                }
            }
        }
        System.out.println("离黄金分割点(0.618)最近的两个数相除是:"+(int)m+"/"+(int)n+"="+(m / n));
    }
}

[改进]
1.将第3行的float i, j直接放到for循环嵌套中,这样可以节省内存空间?
2.第7~9行代码建议修改为:

if(i % 2 == 0 && j % 2 == 0)continue;//在分子分母不同时为偶数的前提下,再计算分数值

value =  (i / j > 0.618f) ? (i / j - 0.618f) : (0.618f - i / j);//求分数值与黄金分割点的差值绝对值

这样做的好处有:if continue减少程序的冗【rong】长;三目表达式简洁清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值