【问题标题】:Prime Factorization With Java and Finding an Upper Bound使用 Java 进行素数分解并找到上界
【发布时间】:2016-03-26 20:21:12
【问题描述】:

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

目标:找出数 n 的素因式分解。然后将质因子连接成一个数,x。然后取那个数字 x,然后除以 n。如果 x%n = 0,则打印 True。如果 x%n != 0,则打印 false。 (即如果 n = 100,质因数是 2,2,5,5。变成 2255,然后取 2255/100。2255%100 != 0,打印 False。)

我现在可以正确打印出某些数字的素数,但是当我尝试使用另一个素数时,程序将退出。另外,如果我使用像 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);    
    }
}

}

【问题讨论】:

标签: java primes prime-factoring


【解决方案1】:

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

原因是代码中的优化,当当前因子超过sqrt(n1)(for 循环标头中的条件i*i &lt;= 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,所以这里有些细节可能有点模糊。

【讨论】:

  • 在循环之后我应该在哪里添加 n1?在 While 循环之后,还是在 for 循环之后?你是说如果 i*i != 1,或者如果 n1%i != 1?您介意通过复制您正在谈论的我的代码部分来向我展示吗?顺便谢谢你的回复。
  • @L Brunot:完成。 P.S.:如果您发现它充分回答了您的问题,请记住接受我的回答。请快速浏览tour page 以获取概览并了解投票问题、答案和 cmets 为何如此重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多