【问题标题】:Finding square roots using approximations and loop使用近似和循环求平方根
【发布时间】:2016-06-13 19:45:02
【问题描述】:

这个程序应该取一个非负整数并求平方根
非负数 n 的平方根可以连续计算 近似值。在每一步,都会计算一个新的近似值,如下所示:

下一个近似值 = (n / 当前 + 当前) / 2

近似的过程一直持续到值足够接近为止, 也就是(current * current)和n的差值足够小 可以接受。 但是,当我打印我的答案时,什么也没有出现。我究竟做错了什么。我的循环是否工作不正常?

import java.io.*;
import java.util.*;
import java.lang.*;
import java.text.*;

public class Squareroot1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a non negative integer: ");
        double n = in.nextInt();
        double result = approx(n);
        /*double current = result;
            while ((current * current)- n == Math.sqrt(n)) {
                double nextapproximation = (n/current + current)/2;
                nextapproximation = current;
                System.out.println(nextapproximation);
        }*/

        System.out.println( result);
    }

    public static double approx(double val) {
        double current = val;
        double approximation = (val / current + current) / 2;
        return approximation;
    }
}

【问题讨论】:

  • 在你的aprox函数中,设置变量current等于val的目的是什么?您的 aprox 函数似乎总是返回 (1 + val) / 2,因为 val 等于 current
  • 因为当前值是 val 例如,如果我输入 25 作为数字来查找平方根,即我正在测试的当前值
  • 如果你单步执行你的代码,current 被设置为val,所以两个变量都等于,比如说,25。然后,你的近似值被设置为(25/25 + 25)/2,因为@987654331 @ 和 val 相等。这适用于每次调用您的函数时。我不认为这就是你的目标,是吗?

标签: java loops square-root


【解决方案1】:

你有几个问题:

1) 你的 while 循环条件应该是:

while ((current * current) - n != 0)

2) 您没有将current 设置为nextapproximation 的值

3) 您没有打印出最终结果(应该是最新的)。

代码

double result = aprox(n);
double current = result;
while ((current * current) - n != 0)
{
    double nextapproximation = (n / current + current) / 2;

    // Stop infinite loop
    if (nextapproximation == current)
    {
        break;
    }
    current = nextapproximation;
    System.out.println(current);
}
System.out.println("Result: " + current);

测试运行

Enter a non negitive integer: 23
6.958333333333333
5.131861277445109
4.806832989404423
4.795844112917605
4.795831523329245
4.795831523312719
Result: 4.795831523312719

编辑

您不需要aprox 方法,也不需要result 变量。

在while循环之前简单地做:

double n = in.nextInt();
double current = (n / n + n) / 2;

【讨论】:

  • 当我输入 25 时它可以工作,但是当我输入 23 时我得到一个无限循环
  • @Dem 欢迎您。很高兴我能帮上忙。此外,您不需要 aprox 方法,也不需要结果变量。在 while 循环之前,您可以使用:double current = (n / n + n) / 2;
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2019-03-06
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多