我正在为BigInteger这样的大数字开发一个自定义数字类。我必须创建这个方法,它找到给定数字的素数因子分解。问题在于该方法,当我分配一个数字的当前值并且它很快就找不到分解时(比如在2或3次迭代之后),该值意外地改变。这是代码
public ArrayList<String> factors(){
ArrayList<String> pList = new ArrayList<>();
FedNumbers in = this;
FedNumbers d = new FedNumbers("2");
FedNumbers zero = new FedNumbers("0");
FedNumbers squared = d.product(d);
while(d.compareTo(in)<=0){
System.out.println(in);
if(in.divideR(d).compareTo(zero)==0){
pList.add(d.toString());
in=in.divideQ(d);
}
else{
d.inc();
squared=d.product(d);
}
}
pList.add(in.toString());
return pList;
}
这是开头时161的输出:
161 161 151 141 141 131 121 121 111 111 111 101 [1]
它永远不会进入迭代,我尝试使用残差进行除法并且仅在测试器中进行比较并且它起作用,无法理解为什么在没有任何理由的情况下两次迭代后in值突然改变。
这是我正在尝试分解的值或当前值,同样的事情发生在许多其他数字上,每次我检查它的唯一值随机变化。当我分开并使用divideQ或divideR分开或相乘时,它总能完美地工作。感谢您的帮助
答案 0 :(得分:2)
我认为问题的根源在于:
require()
我可能错了,但可能是你认为这个FedNumbers in = this;
当前对象,即你调用copies
的对象,创建factors()
作为新对象?
事实并非如此。复制引用只会为同一对象建立另一个引用。在整个in
中,factors
和this
指的是同一个对象。
将复制构造函数添加到代码中应该不会太困难。