好的,所以我一直在网上搜索并发现了许多与此问题相关的内容。但是,为了弄清楚这一点,我无法将各个部分放在一起。
要求是计算一个大的因子(例如999!)使用链接的LISTS和NODES。网上有很多人已经展示了计算阶乘的基本方法,我理解如何做阶乘部分,但是我遇到麻烦的部分是用0-999(三位数)之间的Int填充每个节点然后打印出每个节点看起来像一个整数(包括逗号)。
我怎样才能做到这一点? - 我的想法是得到n的结果!并且只做%10,%100等等。将它分解并将部分插入到节点中,但这样做毫无意义,因为必须完全解决因子才能使其工作。所以这将是愚蠢的。
这样做的原因是为了学习如何操作我的Data Structures类的节点和链表。
对我来说,这是一个明确的解释,但如果问题不清楚,请告诉我,我会尽力解释。任何帮助将不胜感激。
(除了我用作构建基础的基本因子函数之外,我没有显示任何代码。)
答案 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的链接。我并不完全确定你所追求的是什么,唉......这是我最好的猜测。
该算法包括五个步骤:
它受到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);
}