所以这是一个班级作业。我似乎无法掌握长期分裂的复杂性。坦率地说,我甚至不确定如何开始解决算法,使其能够满足我的需求。
对于第二部分,我们必须接收用户输入的数字,并找到用户也输入的特定小数位数的平方根。我需要复制以找到平方根的算法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中进行长除法,或者在有或没有评论的情况下为其留下代码来帮助我,我们将不胜感激!
答案 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;
}