使用长除法找到平方根

时间:2015-06-03 23:17:30

标签: java algorithm square-root

所以这是一个班级作业。我似乎无法掌握长期分裂的复杂性。坦率地说,我甚至不确定如何开始解决算法,使其能够满足我的需求。

对于第二部分,我们必须接收用户输入的数字,并找到用户也输入的特定小数位数的平方根。我需要复制以找到平方根的算法here

以下是我到目前为止所做的事情(显然到目前为止没有取得多大进展):

Error while processing route: types.index You passed `controller: 'organization.datasets.new'` into the `render` method, but no such controller could be found. Error: You passed `controller: 'organization.datasets.new'` into the `render` method, but no such controller could be found.

此要求的输出示例如下:

import java.util.*;
import java.math.*;
import TerminalIO.*;

public class squareRootProgram{

    public static float squareRootDiv(String number, int decimals){

        String[] test = new String[2];
        float answer = 0;
        String groups = "";

        test = number.split("\\.");
        test = number.split("\\.");
        System.out.println(test[0]);
        System.out.println(test[1]);

        for(int i = 0; groups != test[i].toString(); i++){
            test[i].length();
        }
        return answer;
    }

public static void main(String[]args){

    KeyboardReader reader = new KeyboardReader();
    String response = " ";
    String initNumber = " ";
    float number = 0;
    int decimals = 0;

    System.out.println("Welcome to the square root program.");
    do{
        addLine();
        System.out.print("Please enter the number of which you want to find the square root:  ");
        initNumber = reader.readLine();
        number = Float.valueOf(initNumber);
        System.out.println(number);
        System.out.print("Please enter the number of decimal places in which you want your answer:  ");
        decimals = reader.readInt();

        System.out.println("The answer provided by division algorithm is " + squareRootDiv(initNumber,decimals));

        addLine();
        System.out.print("Would you like to try another number?: ");
        response = reader.readLine();
    }while(response.compareTo("no")!=0);

}
}

显然,这需要适用于任何数字输入和用户希望返回平方根的任何小数位数。

因此,如果有人可以通过向我解释如何在Java中进行长除法,或者在有或没有评论的情况下为其留下代码来帮助我,我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

我创建了一个程序的工作版本。您提供的说明为我们提供了一系列我在代码中使用的步骤。

如过程所示,我们首先找到整数部分并尝试找到"最接近的"广场。在给定的例子中,"最接近" square to 40 is 36.让我们逐步完成这个步骤。

public static double squareRootDiv (String number, int decimals) {
     if (decimals <= 0) return -1; //Sanity check
     int iPart = Integer.parseInt(number.split("\\.")[0]);

该代码将只给出整数部分,以便我们可以找到最接近的正方形,我们通过运行循环(您可以使用二进制搜索来改进)来完成,如下所示:

int closestSquare = 0;
for (closestSquare = 0; closestSquare <= iPart; closestSquare++) {
     if (closestSquare * closestSquare > iPart) {
          closestSquare -= 1;
          break;
     }
}

这样做是检查我们找到的整数部分的每个数字。第一个数字大于整数部分表示我们已经超越了。我们向后退一次,这是最接近的广场。确保你创建一个记住小数位应该去的位置的变量:

int decimalIx = ans.length();

第2步:找到小数。

程序要求我们跟踪到目前为止我们找到的数字,以及从整数部分中减去的最接近的平方的剩余部分。在找到40的情况下,余数为40 - 36 = 4.我们目前的答案是6。

程序要求我们将当前答案加倍并将其乘以10,有效地将当前答案乘以20.如果我们这样做,我们得到120.为了简单起见,我们称之为A 。然后,我们必须找到一个要添加到A的数字,使得(A +数字)*数字&lt;具体而言,我们必须找到一些数字1到9,使得(120 +(某个数字))*某个数字<1。 4 * 100。

我们可以使用decimals参数绑定我们的循环,如下所示:

for (int i = 0; i < decimals; i++) {
     remainder *= 100;
     int base = Integer.parseInt(ans) * 20;
     //Now check digits
     for (int j = 9; j >= 0; j--) {
          int trial = (base + j) * j; //Use the digit
          if (trial < remainder) {
               //We have found the first digit that is less than the remainder!
               remainder -= trial;
               ans += j;
               break;
          }
     }
}

现在剩下的就是回复答案:

return Double.parseDouble(ans.substring(0, decimalIx) + "." + ans.substring(decimalIx));

这是完整的代码。

public static double squareRootDiv(String number, int decimals){
        if (decimals <= 0) return -1;

        String ans = "";

        int iPart = Integer.parseInt(number.split("\\.")[0]);

        int first = getNext(iPart);
        int remainder = iPart - first*first;
        ans += first;
        int decimalIx = ans.length();
        int numDecimalsNeeded = decimals - ans.length();

        for (int i = 0; i <= numDecimalsNeeded; i++) {

            remainder *= 100;
            int base = Integer.parseInt(ans) * 20;

            for (int j = 9; j >= 0; j--) {

                int trial = (base + j) * j;

                if (trial < remainder) {
                    remainder -= trial;
                    ans += j;
                    break;
                }
            }
        }



        return Double.parseDouble(ans.substring(0, decimalIx) + "." + ans.substring(decimalIx));
    }

    public static int getNext (int iPart) {
        for (int i = 0; i <= iPart; i++) {
            if (i*i > iPart) {
                return i - 1;
            }
        }
        return -1;
    }