使用Java进行素数因子分解并找到上界

时间:2016-03-26 20:21:13

标签: java primes prime-factoring

这是我要做的。我在下面列出了我的代码供您参考。提前感谢您提供的任何帮助。

目标:查找数字n的Prime Factorizations。然后将素因子连接成一个数字x。然后取这个数字,x,然后除以n。如果x%n = 0,则打印True。如果x%n!= 0,则打印为false。 (即如果n = 100,则Prime因子为2,2,5,5。转为2255,然后取2255/100.2255%100!= 0,打印错误。)

我现在已经为某些数字正确打印了素因子,但是当我尝试使用另一个素数时,程序将退出。此外,如果我使用123这样的数字,它只打印3,而不是3和41.您有任何建议吗?

如果可能的话,理想情况下我想通过任何上限设置运行此数字j = 2,调用上限U,如果j = 2到U的任何值产生的结果为真(从上面)然后我想打印那个j值。

import acm.program.*;
import acm.util.*;
import java.util.Scanner;
import java.util.Arrays.*;
// -------------------------------------------------------------------------

public class FactorsLoop extends ConsoleProgram
{
//~ Instance/static variables .............................................
private RandomGenerator rgen = RandomGenerator.getInstance();
//~ Constructor ...........................................................
// ----------------------------------------------------------
/**
 * Creates a new ForLoops object.
 */
public void run()
{
    // 


    int n1 = 10000;
    int n2 =(n1);

    double U = 10000;
    StringBuilder factors = new StringBuilder();
    for (int j = 2; j < U; j++) {

        for (int i = 2; i*i <= n1; i++) {
            // if i is a factor of N, repeatedly divide it out
            while (n1% i == 0) {

                n1 = n1 / i;


                factors.append(Integer.toString(i));

            }

        }

    }

    double newNumber = Integer.parseInt(factors.toString());

    double x = (newNumber / n2);

    print(x);

    if ( newNumber % n2 == 0 ){
        println(n2);    
    }
}

}

1 个答案:

答案 0 :(得分:0)

您的代码正确地将所有这些素数添加到它所分割的factors。但是,它也应该在循环之后添加n1,如果恰好是!= 1(这将在最大因子的幂为1时精确发生)。

原因是代码中的优化,当当前因子超过sqrt(n1)(for循环标题中的条件i*i <= n1)时退出内循环。这是一个有效的优化,但像许多优化一样,它使逻辑变得更复杂,更容易出错...

注意:迭代j的外部循环似乎没有任何意义;它只会导致重复附加小因子。将内循环变为工作形状,将其分解为单独的函数(双关语),然后使用它来实现远程测试,该测试查找满足某些标准的第一个结果。

例如,返回连接因子的函数可能如下所示:

public string concatenated_factors (int n)
{
    StringBuilder result = new StringBuilder();

    for (int i = 2; i * i <= n; ++i)
        for ( ; n % i == 0; n /= i)
            result.append(Integer.toString(i));

    if (n != 1)
        result.append(Integer.toString(n));

    return result.toString();
}

注意:我不熟悉Java,所以这里的一些细节可能有点模糊。