奇怪的是我的第一个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”吗?
编辑:我想我的意思是将ret
设置为n
,可能是它,或者......可能不是。
答案 0 :(得分:5)
尝试更改
ret.multiply(i);
到
ret = ret.multiply(i);
答案 1 :(得分: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);
答案 2 :(得分:2)
BigInteger对象是不可变的(意味着你无法改变它)。这样,它就像一个String对象。因此,要实现这一点,您需要更改行
ret.multiply(i);
到
ret = ret.multiply(i);
答案 3 :(得分: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;
}