【问题标题】:Largest prime factor of a number in JavaJava中数字的最大素数
【发布时间】:2016-03-25 01:06:53
【问题描述】:

在解决这个问题here 时,我试图找到一个数的最大素数。我认为我做的一切都是正确的,但是其中一个测试用例(#2)失败了,我想不出任何可能失败的极端情况。这是我的代码,请看看并尝试发现一些东西。

public class ProblemThree
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        for (int i = 0; i < T; i++)
        {
            System.out.println(largestPrime(scanner.nextLong()));
        }
    }

    private static long largestPrime(long n)
    {
        while (n % 2 == 0)
        {
            n = n / 2;  // remove all the multiples of 2
        }
        while (n % 3 == 0)
        {
            n = n / 3; // remove all the multiples of 2
        }

        // remove multiples of prime numbers other than 2 and 3
        while (n >= 5)
        {
            boolean isDivisionComplete = true;
            for (long i = 5; i < Math.ceil(Math.sqrt(n)); i++)
            {
                if (n % i == 0)
                {
                    n = n / i;
                    isDivisionComplete = false;
                    break;
                }
            }
            if (isDivisionComplete)
            {
                break;
            }
        }
        return n;
    }
}

基本上,我在做的是:

Largest_Prime(n):
1. Repeatedly divide the no by any small number, say x where 0 < x < sqrt(n).
2. Then set n = n/x and repeat steps 1 and 2 until there is no such x that divides n.
3  Return n.

【问题讨论】:

  • 提示:您的代码表明4 的最大素数是1

标签: java algorithm primes prime-factoring


【解决方案1】:

您的代码中似乎存在一些错误,例如当您输入 16 largestPrime 函数返回 1 时。当输入是 3 的幂时也是如此。

【讨论】:

    【解决方案2】:

    详细算法说明: 您可以通过保留三个变量来做到这一点: 您要考虑的数字 (A) 当前除数存储 (B) 最大的除数商店 (C) 最初,让 (A) 成为您感兴趣的数字 - 在这种情况下,它是 600851475143。然后让 (B) 成为 2。有一个条件来检查 (A) 是否可以被 (B) 整除。如果它可整除,则将 (A) 除以 (B),将 (B) 重置为 2,然后返回检查 (A) 是否可被 (B) 整除。否则,如果 (A) 不能被 (B) 整除,则将 (B) 增加 +1,然后检查 (A) 是否可被 (B) 整除。运行循环,直到 (A) 为 1。返回的 (3) 将是 600851475143 的最大素数。

     public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for(int a0 = 0; a0 < t; a0++){
            long n = in.nextLong();
            long A=n;
            long B=2;
            long C=0;
            while(Math.pow(B,2)<=A)
                {
                if(A%B==0)
                    {
                    C=B;
                    A=A/B;
                    B=2;
                }
                else
                   B++;
    
            }
               if(A>=C)
                C=A;
               if(A==1)
                   { C=2;
                    break;
                   }
             System.out.println(C);   
        }
    }
    

    【讨论】:

    • 请尽量避免只给出代码答案。如果您能解释一下您要展示的内容,或者您​​正在解决问题中的任何特定问题,那就太好了。
    • 非常感谢。我写了与解决方案相关的详细信息。
    • @Shree 你的解决方案是帮助满满的。
    【解决方案3】:

    为什么要删除 2 的倍数和 3 的倍数?这样,如果您的数字是 2 和 3 的任意组合,您的答案将是 1,这显然是错误的。

    对于这个问题,您可以执行从 2 到 sqrt(n) 循环的简单方法并存储除以 n 的最大数,当您完成循环时只返回您找到的最高除数。

    【讨论】:

      【解决方案4】:

      1 放弃 2 和 3 的循环。如果没有,你不会得到 2、2x2、3、2x3,...所有 2 和 3 的倍数

      2 将循环更改为在 2(而不是 5)处停止:

      while (n >= 2)
      {
      

      3 如果 2 则停止

      if (n==2) return 2;
      

      4 循环从 2

      5 循环直到 sqrt(n),

      for (long i = 2; i <= Math.ceil(Math.sqrt(n)); i++)
      

      【讨论】:

        【解决方案5】:

        提取素因数的一种简单方法如下:

        /**
         * Prime factors of the number - not the most efficient but it works.
         *
         * @param n - The number to factorise.
         * @param unique - Want only unique factors.
         * @return - List of all prime factors of n.
         */
        public static List<Long> primeFactors(long n, boolean unique) {
          Collection<Long> factors;
          if (unique) {
            factors = new HashSet<>();
          } else {
            factors = new ArrayList<>();
          }
          for (long i = 2; i <= n / i; i++) {
            while (n % i == 0) {
              factors.add(i);
              n /= i;
            }
          }
          if (n > 1) {
            factors.add(n);
          }
          return new ArrayList<>(factors);
        }
        

        第一个循环是个问题。他们会将所有偶数减少到1 - 因此缺少2 作为因素。更改要使用的代码:

        while (n > 2 && n % 2 == 0) {
          n = n / 2;  // remove all the multiples of 2
        }
        while (n > 3 && n % 3 == 0) {
          n = n / 3; // remove all the multiples of 2
        }
        

        您还有其他问题 - 例如。您报告25 的最大素数为2549 的最大素数为49

        只需使用你的和我的运行这段代码,看看你的失败在哪里:

        for (long i = 1; i < 1000; i++) {
          long largestPrime = largestPrime(i);
        
          List<Long> primeFactors = primeFactors(i, true);
          if (primeFactors.size() > 0) {
            Collections.sort(primeFactors, Collections.reverseOrder());
            long highestFactor = primeFactors.get(0);
            if (largestPrime != highestFactor) {
              System.out.println("Wrong! " + i + " " + largestPrime + " != " + primeFactors);
            }
          } else {
            System.out.println("No factors for " + i);
          }
        }
        

        【讨论】:

        • 这家伙正在寻求帮助以修复他的代码,而您通过复制 another answer 的代码来回答它,就好像这是一个“为我编写代码”问题?
        • @DidierL - 这是一个面向专业人士的板子 - 我为问题提供专业的解决方案 Java 中数字的最大素数
        • 那你为什么不直接关闭这个问题作为任何其他完全相同的问题的副本?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多