使用Java中的节点计算大因子

时间:2014-03-31 00:50:16

标签: java factorial

好的,所以我一直在网上搜索并发现了许多与此问题相关的内容。但是,为了弄清楚这一点,我无法将各个部分放在一起。

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

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

这样做的原因是为了学习如何操作我的Data Structures类的节点和链表。

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

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

3 个答案:

答案 0 :(得分:0)

使用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);
}

答案 1 :(得分:0)

好的,我想我明白你的意思。

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

该算法包括五个步骤:

  1. 构建阶乘成员列表。
  2. 计算和分组阶乘成员的Prime因子。
  3. 将权力因素分配给10的权力。
  4. 乘以Prime因子,将溢出进入下一个小数 的地方。
  5. 打印解决方案。
  6. 它受到here on math.stackexchange.com描述的方法的启发。我强烈建议在阅读Gist之前阅读问题和答案。

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

    我希望它可以帮到你。祝你好运。

答案 2 :(得分:0)

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

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