如何获得 BigInteger 的准确长度?
How can I get an accurate length of a BigInteger?
我正在尝试创建一个程序,该程序将生成斐波那契数列中的数字,直到它找到该数列中的 1,000 位数字。我使用的代码运行良好并提供有效输出,但是,我无法检索每个数字的长度;使用 BigInteger
我已将 BigInteger
转换为 String
并使用 String.length()
方法来获取长度,但是,我发现这并没有给出实际长度,我不明白为什么。
import java.util.ArrayList;
import java.math.BigInteger;
public class problemTwentyFive {
public static void main(String [] args) {
ArrayList<BigInteger> fibonacciNumbers = new ArrayList<BigInteger>();
boolean validNo = true;
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+x));
fibonacciNumbers.add(new BigInteger(""+x));
do {
tempAns = fibonacciNumbers.get(x-1).add(fibonacciNumbers.get(x-2));
if (tempAns.toString().length() <= 1000) {
System.out.println(tempAns.toString().length());
if(tempAns.toString().length() == 1000) {
fibonacciNumbers.add(tempAns);
validNo = false;
break;
} else {
fibonacciNumbers.add(tempAns);
}
}
x++;
if (tempAns.toString().length() > 1000) {
validNo = false;
break;
}
System.out.println(tempAns);
} while (validNo == true);
System.out.println("The first term in the Fibonacci sequence to contain 1,000 digits is term: " + fibonacciNumbers.size());
}
}
有没有更好的方法来获取BigInteger
的长度?我已经提到了问题 thBigInteger: count the number of decimal digits in a scalable method
更新
运行程序后输出的text文本为:
The first term in the Fibonacci sequence to contain 1,000 digits is term: 4781
我们知道这是错误的,因为如果我们查看我正在尝试的项目,当我们输入 4781 作为答案时,它是不正确的。点击here查看项目(Project Euler - 第25题)
执行此代码时(即找到解决方案):
if ((tempAns.toString().length()) == 1000)
{
fibonacciNumbers.add(tempAns);
validNo = false;
break;
}
未打印 tempAns。这就是为什么你最后打印的号码只有 999 位。
如果在末尾添加 System.out.println("and is: " + tempAns);
,就在 main 方法结束之前,您将获得所需的数字。因此答案是 4781 + 1 = 4782
我认为真正的问题是您开始使用值 2,2,...但它应该是 1,1,...
这里:
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+x));
fibonacciNumbers.add(new BigInteger(""+x));
应该是:
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+1));
fibonacciNumbers.add(new BigInteger(""+1));
这会使你的系列在一个学期后达到 1000 的长度值,从而为你提供 Bukhard 给你的真正答案(我认为出于错误的原因,因为你正在添加长度为 1000 的值)。
由于代码重复和许多分支,代码看起来比应有的复杂。例如,您测试 (... <= 1000)
和 (... = 1000)
,然后再次测试 (... > 1000)
。这个逻辑不容易理解。我保留了你的算法,但只是删除了所有这些分支测试的噪音:
public static void main(String [] args) {
ArrayList<BigInteger> fibonacciNumbers = new ArrayList<BigInteger>();
boolean validNo = true;
int x = 2;
BigInteger tempAns = null;
fibonacciNumbers.add(BigInteger.valueOf(1));
fibonacciNumbers.add(BigInteger.valueOf(1));
do {
tempAns = fibonacciNumbers.get(x-1).add(fibonacciNumbers.get(x-2));
fibonacciNumbers.add(tempAns);
x++;
System.out.println("x=" + x + ", length=" + tempAns.toString().length());
if(tempAns.toString().length() >= 1000) {
validNo = false;
}
} while (validNo == true);
System.out.println("The first term in the Fibonacci sequence to contain 1,000 digits is term: " + fibonacciNumbers.size());
}
我正在尝试创建一个程序,该程序将生成斐波那契数列中的数字,直到它找到该数列中的 1,000 位数字。我使用的代码运行良好并提供有效输出,但是,我无法检索每个数字的长度;使用 BigInteger
我已将 BigInteger
转换为 String
并使用 String.length()
方法来获取长度,但是,我发现这并没有给出实际长度,我不明白为什么。
import java.util.ArrayList;
import java.math.BigInteger;
public class problemTwentyFive {
public static void main(String [] args) {
ArrayList<BigInteger> fibonacciNumbers = new ArrayList<BigInteger>();
boolean validNo = true;
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+x));
fibonacciNumbers.add(new BigInteger(""+x));
do {
tempAns = fibonacciNumbers.get(x-1).add(fibonacciNumbers.get(x-2));
if (tempAns.toString().length() <= 1000) {
System.out.println(tempAns.toString().length());
if(tempAns.toString().length() == 1000) {
fibonacciNumbers.add(tempAns);
validNo = false;
break;
} else {
fibonacciNumbers.add(tempAns);
}
}
x++;
if (tempAns.toString().length() > 1000) {
validNo = false;
break;
}
System.out.println(tempAns);
} while (validNo == true);
System.out.println("The first term in the Fibonacci sequence to contain 1,000 digits is term: " + fibonacciNumbers.size());
}
}
有没有更好的方法来获取BigInteger
的长度?我已经提到了问题 thBigInteger: count the number of decimal digits in a scalable method
更新 运行程序后输出的text文本为:
The first term in the Fibonacci sequence to contain 1,000 digits is term: 4781
我们知道这是错误的,因为如果我们查看我正在尝试的项目,当我们输入 4781 作为答案时,它是不正确的。点击here查看项目(Project Euler - 第25题)
执行此代码时(即找到解决方案):
if ((tempAns.toString().length()) == 1000)
{
fibonacciNumbers.add(tempAns);
validNo = false;
break;
}
未打印 tempAns。这就是为什么你最后打印的号码只有 999 位。
如果在末尾添加 System.out.println("and is: " + tempAns);
,就在 main 方法结束之前,您将获得所需的数字。因此答案是 4781 + 1 = 4782
我认为真正的问题是您开始使用值 2,2,...但它应该是 1,1,...
这里:
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+x));
fibonacciNumbers.add(new BigInteger(""+x));
应该是:
int x = 2;
BigInteger tempAns = new BigInteger(""+0);
fibonacciNumbers.add(new BigInteger(""+1));
fibonacciNumbers.add(new BigInteger(""+1));
这会使你的系列在一个学期后达到 1000 的长度值,从而为你提供 Bukhard 给你的真正答案(我认为出于错误的原因,因为你正在添加长度为 1000 的值)。
由于代码重复和许多分支,代码看起来比应有的复杂。例如,您测试 (... <= 1000)
和 (... = 1000)
,然后再次测试 (... > 1000)
。这个逻辑不容易理解。我保留了你的算法,但只是删除了所有这些分支测试的噪音:
public static void main(String [] args) {
ArrayList<BigInteger> fibonacciNumbers = new ArrayList<BigInteger>();
boolean validNo = true;
int x = 2;
BigInteger tempAns = null;
fibonacciNumbers.add(BigInteger.valueOf(1));
fibonacciNumbers.add(BigInteger.valueOf(1));
do {
tempAns = fibonacciNumbers.get(x-1).add(fibonacciNumbers.get(x-2));
fibonacciNumbers.add(tempAns);
x++;
System.out.println("x=" + x + ", length=" + tempAns.toString().length());
if(tempAns.toString().length() >= 1000) {
validNo = false;
}
} while (validNo == true);
System.out.println("The first term in the Fibonacci sequence to contain 1,000 digits is term: " + fibonacciNumbers.size());
}