【问题标题】:Calculate Large Factorials Using Nodes in Java在 Java 中使用节点计算大阶乘
【发布时间】:2021-07-19 02:09:10
【问题描述】:

好的,所以我一直在搜索互联网,发现了很多与这个问题相关的东西。但是,我无法将这些部分拼凑起来以解决这个问题。

要求是使用链接列表和节点计算大阶乘(例如 999!)。网上有很多人已经展示了计算阶乘的基本方法,我了解如何进行阶乘部分,但我遇到问题的部分是用 0-999 之间的 Int 填充每个节点(三位数字)然后打印出每个节点看起来像一个整数(包括逗号)。

我怎样才能做到这一点? - 我的想法是得到n的结果!只需执行 %10、%100 等 .. 将其分解并将零件插入节点中,但这毫无意义,因为必须完全解决阶乘才能使其工作。所以那是愚蠢的。

这样做的原因是为了学习如何为我的数据结构类操作节点和链表。

对我来说,这是一个明确的解释,但如果问题不清楚,请告诉我,我会尽力解释。任何帮助将不胜感激。

(除了我用作构建基础的基本阶乘函数之外,我没有任何代码可显示)。

【问题讨论】:

  • 这是java 还是javascript 的问题?
  • 为什么要添加标签node.js?这是java还是JavaScript?您的问题不清楚:请添加有关每个节点存储的内容以及您希望对那里的数据做什么的详细信息。

标签: java factorial


【解决方案1】:

好的,我想我明白你的目的了。

在这个答案的最后是一个解决这个问题的 Gist 的链接。我不完全确定这就是你所追求的,唉……这是我最好的猜测。

该算法由五个步骤组成:

  1. 构建阶乘成员列表。
  2. 计算和分组阶乘成员的素因子。
  3. 按 10 的幂分布质因数。
  4. 乘以素数,溢出到下一位小数 地点。
  5. 打印解决方案。

它的灵感来自here on math.stackexchange.com 描述的方法。我强烈建议在检查 Gist 之前阅读链接的问题和答案。

既然已经说了,可以在here 找到要点。它非常粗糙,仅作为该方法的快速演示。

希望对你有帮助。祝你好运。

【讨论】:

  • 略读后,这很可能是我问题的答案。谢谢!我真的很感谢你的帮助。 +1
【解决方案2】:

使用LinkedList 计算阶乘是一个简单的两阶段过程。

第 1 阶段是创建一个包含所有数字的 LinkedList,直到您想要阶乘的数字。这是一个非常简单的操作,可以通过基本的 for 循环来实现。

List<Integer> list = new LinkedList<Integer>();
for(int i = 1; i <= limit; i++) {
    list.add(i);
}
System.out.println(list);

第 2 阶段也相对简单,使用 foreach 循环,我们迭代列表的内容并将每个元素乘以之前列表元素的乘积。

然而,一个主要的问题是像999 这样大的数字的阶乘不能保存在Java 的任何原始数字类型(int 甚至long)中。为了保持阶乘,我们必须使用 Java 的 BigDecimal 类 (Java Docs)。

//Stage 2: Calculate the factorial.
BigDecimal factorial = new BigDecimal(1);
BigDecimal factor = null;
for(int n : list) {
    factor = new BigDecimal(n);
    factorial = factorial.multiply(factor);
}

通过这两个阶段,我们可以简单地打印factorial 的内容以查看您提供的数字的阶乘。请看下面的完整代码:

public static void factorial(int limit) {
    // Stage 1: Build the list.
    List<Integer> list = new LinkedList<Integer>();
    for(int i = 1; i <= limit; i++) {
        list.add(i);
    }
    System.out.println(list);

    //Stage 2: Calculate the factorial.
    BigDecimal factorial = new BigDecimal(1);
    BigDecimal factor = null;
    for(int n : list) {
        factor = new BigDecimal(n);
        factorial = factorial.multiply(factor);
    }
    System.out.println(factorial);
}

【讨论】:

  • 我想我明白你在做什么。请看链接中的图片:FactorialExample 我认为你在做粉线以下的事情,但应该做的事情显示在粉线以上。你能看到照片吗?
  • @user3479429 请问您是如何计算粉色线上方的三位数字的?您只是将结果分成三位数吗?
  • 哈哈,这就是算法的难点所在。如果我知道,我就不会在这里。我只知道每个三位数字代表答案的一部分,如图上方所示。我不确定如何在这些数字变大之前获得这些数字,这样我就不必使用 BigDecimal。
【解决方案3】:

我们像实际一样对数字的每个数字进行乘法运算,然后结转。每个数字都存储在链表的一个节点中。该数字以相反的顺序存储,因此我们可以在不使用任何额外空间的情况下进行乘法。

public static void find(int n) {
Node head=new Node(1);

for(int i=2;i<=n;i++)
    multiply(i,head);

print(head);

}

private static void multiply(int k, Node head) {

int carry=0,prod=0;
Node prev=null;
while(head!=null)
{
    prod=head.data*k+carry;
    head.data=prod%10;
    carry=prod/10;
    prev=head;
    head=head.next;
}

while(carry!=0) {
    Node n=new Node(carry%10);
    prev.next=n;
    carry=carry/10;
    prev=prev.next;
}

}
private static void print(Node head) { //printing in reverse order
if(head==null)
    return;
print(head.next);
System.out.print(head.data);

}

The concept is best explained here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多