变量值可变,而无需在代码中更改它

时间:2016-04-18 02:36:34

标签: java variables biginteger division

我正在为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;

}
divideQ是一种分割并返回系数的方法,而divideR则返回其残差。平方变量的存在是因为我可以在sqrt(n)之前找到它的分解。 product乘以两个值并返回其结果。

这是开头时161的输出:

161 161 151 141 141 131 121 121 111 111 111 101 [1]

它永远不会进入迭代,我尝试使用残差进行除法并且仅在测试器中进行比较并且它起作用,无法理解为什么在没有任何理由的情况下两次迭代后in值突然改变。

这是我正在尝试分解的值或当前值,同样的事情发生在许多其他数字上,每次我检查它的唯一值随机变化。当我分开并使用divideQ或divideR分开或相乘时,它总能完美地工作。感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我认为问题的根源在于:

require()

我可能错了,但可能是你认为这个FedNumbers in = this; 当前对象,即你调用copies的对象,创建factors()作为新对象?

事实并非如此。复制引用只会为同一对象建立另一个引用。在整个in中,factorsthis指的是同一个对象。

将复制构造函数添加到代码中应该不会太困难。