当您需要存储(非常)大的数字时该怎么办?

发布于 2024-07-15 19:12:06 字数 178 浏览 4 评论 0原文

我正在尝试解决 Project Euler 问题,但它涉及将一个非常大的数字相加。 (100!)

使用Java int和long太小了。

感谢您的任何建议

I am trying to do a Project Euler problem but it involves adding the digits of a very large number. (100!)

Using Java int and long are too small.

Thanks for any suggestions

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

分分钟 2024-07-22 19:12:06

BigInteger
看起来这可能就是您正在寻找的。

Class BigInteger
looks like it might be what you are looking for.

冬天的雪花 2024-07-22 19:12:06

使用 BigInteger。 这是示例,来自《Java Examples》一书简而言之,涉及计算阶乘和缓存。

import java.math.BigInteger;
import java.util.ArrayList;

/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or 
 * implied. You may study, use, and modify it for any non-commercial 
 * purpose. You may distribute it non-commercially as long as you 
 * retain this notice. For a commercial use license, or to purchase 
 * the book (recommended), visit 
 * http://www.davidflanagan.com/javaexamples2.
 */

/**
 * This program computes and displays the factorial of a number 
 * specified on the command line. It handles possible user input 
 * errors with try/catch.
 */
public class FactComputer {
  public static void main(String[] args) {
    // Try to compute a factorial.
    // If something goes wrong, handle it in the catch clause below.
    try {
      int x = Integer.parseInt(args[0]);
      System.out.println(x + "! = " + Factorial4.factorial(x));
    }
    // The user forgot to specify an argument.
    // Thrown if args[0] is undefined.
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("You must specify an argument");
      System.out.println("Usage: java FactComputer <number>");
    }
    // The argument is not a number. Thrown by Integer.parseInt().
    catch (NumberFormatException e) {
      System.out.println("The argument you specify must be an integer");
    }
    // The argument is < 0. Thrown by Factorial4.factorial()
    catch (IllegalArgumentException e) {
      // Display the message sent by the factorial() method:
      System.out.println("Bad argument: " + e.getMessage());
    }
  }
}

/**
 * This version of the program uses arbitrary precision integers, so it 
 * does not have an upper-bound on the values it can compute. It uses an 
 * ArrayList object to cache computed values instead of a fixed-size 
 * array. An ArrayList is like an array, but can grow to any size. The 
 * factorial() method is declared "synchronized" so that it can be safely 
 * used in multi-threaded programs. Look up java.math.BigInteger and
 * java.util.ArrayList while studying this class.
 * Prior to Java 1.2, use Vector instead of ArrayList
 */

class Factorial4 {
  protected static ArrayList table = new ArrayList(); // create cache
  static { // Initialize the first element of the cache with !0 = 1.
    table.add(BigInteger.valueOf(1));
  }

  /** The factorial() method, using BigIntegers cached in a ArrayList */
  public static synchronized BigInteger factorial(int x) {
    if (x < 0)
      throw new IllegalArgumentException("x must be non-negative.");
    for (int size = table.size(); size <= x; size++) {
      BigInteger lastfact = (BigInteger) table.get(size - 1);
      BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
      table.add(nextfact);
    }
    return (BigInteger) table.get(x);
  }

  /**
   * A simple main() method that we can use as a standalone test 
   * program for our factorial() method.
   */
  public static void main(String[] args) {
    for (int i = 0; i <= 50; i++)
      System.out.println(i + "! = " + factorial(i));
  }
}

Use BigInteger. Here is an example from the book Java Examples in a Nutshell that involves computing factorials, with caching.

import java.math.BigInteger;
import java.util.ArrayList;

/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or 
 * implied. You may study, use, and modify it for any non-commercial 
 * purpose. You may distribute it non-commercially as long as you 
 * retain this notice. For a commercial use license, or to purchase 
 * the book (recommended), visit 
 * http://www.davidflanagan.com/javaexamples2.
 */

/**
 * This program computes and displays the factorial of a number 
 * specified on the command line. It handles possible user input 
 * errors with try/catch.
 */
public class FactComputer {
  public static void main(String[] args) {
    // Try to compute a factorial.
    // If something goes wrong, handle it in the catch clause below.
    try {
      int x = Integer.parseInt(args[0]);
      System.out.println(x + "! = " + Factorial4.factorial(x));
    }
    // The user forgot to specify an argument.
    // Thrown if args[0] is undefined.
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("You must specify an argument");
      System.out.println("Usage: java FactComputer <number>");
    }
    // The argument is not a number. Thrown by Integer.parseInt().
    catch (NumberFormatException e) {
      System.out.println("The argument you specify must be an integer");
    }
    // The argument is < 0. Thrown by Factorial4.factorial()
    catch (IllegalArgumentException e) {
      // Display the message sent by the factorial() method:
      System.out.println("Bad argument: " + e.getMessage());
    }
  }
}

/**
 * This version of the program uses arbitrary precision integers, so it 
 * does not have an upper-bound on the values it can compute. It uses an 
 * ArrayList object to cache computed values instead of a fixed-size 
 * array. An ArrayList is like an array, but can grow to any size. The 
 * factorial() method is declared "synchronized" so that it can be safely 
 * used in multi-threaded programs. Look up java.math.BigInteger and
 * java.util.ArrayList while studying this class.
 * Prior to Java 1.2, use Vector instead of ArrayList
 */

class Factorial4 {
  protected static ArrayList table = new ArrayList(); // create cache
  static { // Initialize the first element of the cache with !0 = 1.
    table.add(BigInteger.valueOf(1));
  }

  /** The factorial() method, using BigIntegers cached in a ArrayList */
  public static synchronized BigInteger factorial(int x) {
    if (x < 0)
      throw new IllegalArgumentException("x must be non-negative.");
    for (int size = table.size(); size <= x; size++) {
      BigInteger lastfact = (BigInteger) table.get(size - 1);
      BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
      table.add(nextfact);
    }
    return (BigInteger) table.get(x);
  }

  /**
   * A simple main() method that we can use as a standalone test 
   * program for our factorial() method.
   */
  public static void main(String[] args) {
    for (int i = 0; i <= 50; i++)
      System.out.println(i + "! = " + factorial(i));
  }
}
稚然 2024-07-22 19:12:06

java.lang.BigInteger 或 java.lang.BigDecimal

java.lang.BigInteger or java.lang.BigDecimal

少女七分熟 2024-07-22 19:12:06
import java.math.BigInteger;
import java.util.*;

public class Main {
    protected static ArrayList<BigInteger> table = new ArrayList<BigInteger>();

    static {
        table.add(BigInteger.valueOf(1));
    }

    public static synchronized BigInteger factorial(int x) {
        if (x < 0) throw new IllegalArgumentException("x must be non-negative.");
        for (int size = table.size(); size <= x; size++) {
            BigInteger lastfact = table.get(size - 1);
            BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
            table.add(nextfact);
        }
        return table.get(x);
    }

    public static void main(String[] args) {
        for (int i = 0; i <= 50; i++)
            System.out.println(i + "! = " + factorial(i));
    }
}
import java.math.BigInteger;
import java.util.*;

public class Main {
    protected static ArrayList<BigInteger> table = new ArrayList<BigInteger>();

    static {
        table.add(BigInteger.valueOf(1));
    }

    public static synchronized BigInteger factorial(int x) {
        if (x < 0) throw new IllegalArgumentException("x must be non-negative.");
        for (int size = table.size(); size <= x; size++) {
            BigInteger lastfact = table.get(size - 1);
            BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
            table.add(nextfact);
        }
        return table.get(x);
    }

    public static void main(String[] args) {
        for (int i = 0; i <= 50; i++)
            System.out.println(i + "! = " + factorial(i));
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文