1

奇怪的是,这是我的第一个 Java 应用程序,我想实现一个任意精度的阶乘函数,我做了递归的很好,但我的迭代的只是输出“1”,没有别的。对我来说太晚了,我不明白为什么,我不确定我哪里出错了,这里有什么明显的吗?

public static BigInteger ifact(BigInteger n) {
    BigInteger ret = new BigInteger("1");
    BigInteger i = new BigInteger("1");
    for(i = new BigInteger("0"); i.compareTo(n) == 0; i.add(new BigInteger("1"))){
        ret.multiply(i);
    }
    return ret;
}

如果您没有注意到它使用 BigInteger 包,请注意奇怪的文字。

另外,像 C 一样,你能做一些类似于 typedef 的事情,所以我不需要每次都输入“BigInteger”吗?

编辑:我想我的意思是设置retn,可能是这样,或者..也许不是。

4

4 回答 4

5

尝试改变

ret.multiply(i);

ret = ret.multiply(i);
于 2010-09-27T19:11:21.673 回答
5

在回答您的“typedef”问题时,不,您不能在 Java 中这样做。

至于你的代码,它有很多错误。您的循环只会执行一次,并且仅当 n 等于 i 时。为什么在循环开始时将 i 初始化为 1 再初始化为 0?你为什么忽略 的结果i.add(...)?你为什么忽略 的结果ret.multiply(i)?请记住,这些方法不会改变 BI 本身!

这包含了这些更改:

    BigInteger n = BigInteger.valueOf(10);
    BigInteger ret = BigInteger.ONE;
    for (BigInteger i = BigInteger.ONE; i.compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
        ret = ret.multiply(i);
    }
    System.out.println(ret);
于 2010-09-27T19:11:57.697 回答
2

BigInteger 对象是不可变的(意味着您无法更改它)。这样,它就像一个 String 对象。所以,为了这个工作,你会想要改变你的线路

ret.multiply(i);

ret = ret.multiply(i);
于 2010-09-27T19:14:00.203 回答
0
public static BigInteger ifact(BigInteger n) {
  BigInteger ret = BigInteger.ONE;
  for (BigInteger i = BigInteger.ONE; i.compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
    ret = ret.multiply(i);
  }
  return ret;
}
  1. ret = ret.multiply
  2. i.compareTo(n) <= 0
  3. 大整数.ONE;
于 2010-09-27T19:33:16.470 回答