当前位置: 首页 > 知识库问答 >
问题:

如何获得大整数的精确长度?

夏侯野
2023-03-14

我正在尝试创建一个程序,它将生成斐波那契序列中的数字,直到它找到序列中的1000位数字。我使用的代码运行良好并提供有效的输出,但是,我在检索每个数字的长度时遇到了麻烦;使用BigIntger我已将BigIntger转换为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());
  }
}

有没有更好的方法来获取biginger的长度?我已经读到了thBigInteger这个问题:在一个可伸缩的方法中计算小数位数

更新运行程序后输出的文本文本为:

The first term in the Fibonacci sequence to contain 1,000 digits is term: 4781

我们知道这是错误的,因为如果我们查看我正在尝试的项目,当我们输入4781作为答案时,它是不正确的。点击此处查看项目(欧拉项目-问题25)

共有3个答案

刘永望
2023-03-14

由于代码的重复和许多分支,代码看起来比应该的更复杂。例如,您测试(。。。

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());
    }

梁渊
2023-03-14

我认为真正的问题是,你在用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来增加值)。

华温书
2023-03-14

执行此代码时(即找到解决方案):

            if ((tempAns.toString().length()) == 1000)
            {
                fibonacciNumbers.add(tempAns);
                validNo = false;
                break;
            }

坦潘斯没有印刷。这就是为什么你最后打印的数字只有999位。

如果您在最后添加一个System.out.println("and is:"temAns);,就在main方法结束之前,您将获得所需的数字。因此答案是4781 1 = 4782

 类似资料:
  • 好的,这类问题有两部分。 > 我怎样才能得到准确的屏幕中心。因此,如果我制作一个默认为200*200像素的,那么中心将是100*100。(考虑到问题1中的问题)但如果有人调整屏幕的大小(是的,我希望他们能够重新调整大小),那么点仍然是中心。所以如果他们是全屏的,屏幕大小是1200*900,那么中心就是600*450。 我希望这足够清楚

  • 我在Google Code Jam中读到一个关于牛眼的问题。(比赛现在结束了,所以可以谈论它) 玛丽亚从t毫升黑色油漆开始,她将用它来画1厘米厚的戒指。厚度为1cm的圆环是半径相差1cm的两个同心圆之间的空间。 玛丽亚画了第一个黑色的环周围半径为r厘米的白色圆圈。 半径为1cm的圆盘面积为πcm2。需要一毫升油漆覆盖面积πcm2。玛丽亚最多能画多少个黑戒指? 根据我在纸上的计算,画一个有n个环的牛

  • 问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。

  • 我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?

  • 编辑:在评论中进行了一些讨论后,发现由于幸运地了解了浮点数是如何在C中实现的,我问了一些与我想问的不同的东西。 我想使用比更大的整数(对我来说是8个字节)(对我来说是8个字节),可能不会重复出现在数组或bigint库中。由于我的是16个字节,我认为只需切换类型就可以了。结果表明,即使可以表示更大的整数,你也不能在不失去精度的情况下进行操作——用这些更大的整数。所以不可能实现我想做的事情。实际上,正

  • 问题内容: 是否有任何内置函数可以返回对象的长度? 例如,我有哪个应该返回。如果我使用它返回。 它可能是一个简单的循环函数,但我想知道是否有内置函数? 问题答案: 对于支持Object.keys()的浏览器,您可以执行以下操作: 否则(特别是在IE <9中),您可以使用循环自己遍历对象: 该是有确保你只从字面对象计数的属性,而不是从它的原型属性是“继承”。