我如何得到一个确切的答案?

时间:2014-03-28 16:27:26

标签: java

在科罗拉多州的一个保护区内释放了一只20只大角羊的繁殖组。预计经过仔细管理后,将在t年后给出绵羊数N,公式为:

N = 220 /(1 + 10(0.83)t) 一旦人口达到80岁,绵羊群体就能够在没有进一步监督的情况下自我维持。

编写一个程序(使用for循环),从零开始写出N的值,然后上升到25分。听到绵羊听了多少年?

这是我的代码:

import java.lang.Math;

class SheepHerd {

public static void main(String[] args){

    for(double t = 0; t <= 25; t++) {

        double N =  220 / (1 +10 * (Math.pow(.83, t)));
        System.out.println(N);

    }
  }
}

终端向我显示了数字,我可以看到它需要9到10年,但我怎样才能获得确切的年份?

4 个答案:

答案 0 :(得分:0)

由于您已经使用double作为计数器,因此您可以尝试将其递增1,而不是像0.1这样的较小值:

for(double t = 0; t <= 25; t+=0.1) {
        double N =  220 / (1 +10 * (Math.pow(.83, t)));
        if (N >= 80) {
            System.out.println(N + " sheep after " + t + " years");
            break;
        }

    }

通过这种方式,您可以调整所需的时间粒度,但随着每个步骤进入更精确的方向,计算时间会更长。

答案 1 :(得分:0)

在System.out.println(N);

之后添加
If (N >= 80)
   break;

这将导致程序在达到目标编号(80)后退出循环。

最初的问题是询问多少年,所以我们只能假设它要求整整几年。在第9年,你将没有足够的羊,所以它不能是第9年。它必须是10年级。

答案 2 :(得分:0)

您可以解决t的等式(或让其他人为您执行此操作:Wolfram alpha solution)并实施生成的公式:

class SheepHerd
{
    public static void main(String[] args)
    {

        for (double t = 0; t <= 25; t++)
        {
            double N = 220 / (1 + 10 * (Math.pow(.83, t)));
            System.out.println(
                "for t=" + t + " result is " + N + 
                " check: " + computeYears(N));
        }

        System.out.println(computeYears(80));
    }

    public static double computeYears(double N)
    {
        double a = Math.log(22.0 / N - 0.1);
        double b = Math.log(100.0 / 83.0);
        return -a / b;
    }
}

答案 3 :(得分:0)

你绝对可以反转这个功能。如果我的数学并没有让我失望,那就是:

          a
N = -------------
     1 + b * c^t


       1    /  a      \
c^t = --- * | --- - 1 |
       b    \  N      /

              /                        \
       1      |    /  a      \         |
t = ------- * | lg | --- - 1 | - lg(b) |
     lg(c)    |    \  N      /         |
              \                        /

在您的案例中a = 220b = 10c = .83,并获得t的确切值。