Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中数字的最大素因子_Java_Algorithm_Primes_Prime Factoring - Fatal编程技术网

Java中数字的最大素因子

Java中数字的最大素因子,java,algorithm,primes,prime-factoring,Java,Algorithm,Primes,Prime Factoring,在解决这个问题时,我试图找到一个数的最大素因子。我认为我做的每件事都是对的,但是其中一个测试用例(#2)失败了,我想不出任何可能失败的情况。这是我的代码,请看一看,并尝试找出一些东西 public class ProblemThree { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int T = scanner.nextInt

在解决这个问题时,我试图找到一个数的最大素因子。我认为我做的每件事都是对的,但是其中一个测试用例(#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;
    }
}
公共类问题三
{
公共静态void main(字符串[]args)
{
扫描仪=新的扫描仪(System.in);
int T=scanner.nextInt();
for(int i=0;i=5)
{
布尔值isDivisionComplete=true;
for(长i=5;i
基本上,我正在做的是:

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.
最大素数(n):
1.重复将no除以任何小的数字,比如x,其中0
提取素数因子的一种简单方法如下:

/**
 * 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);
}
您还有其他问题-例如,您将
25
的最大基本因子报告为
25
,将
49
的最大基本因子报告为
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);
  }
}
for(长i=1;i<1000;i++){
长最大素数=最大素数(i);
列出primeFactors=primeFactors(i,真);
if(primeFactors.size()>0){
Collections.sort(primeFactors,Collections.reverseOrder());
long highestFactor=primeFactors.get(0);
if(最大主因子!=最高因子){
System.out.println(“错误!”+i+“+largestPrime+”!=“+primeFactors”);
}
}否则{
System.out.println(“无“+i”因素);
}
}

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

为什么要去掉2的倍数和3的倍数?这样,如果你有一个数字是2和3的任意幂的组合,你的答案是1,这显然是错误的


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

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

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

3如果2,停止

if (n==2) return 2;
4从2开始循环


5循环直到sqrt(n),带有详细的算法描述: 您可以通过保留三个变量来实现这一点: 您试图考虑的数字(A) 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);   
    }
}
publicstaticvoidmain(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int t=in.nextInt();
对于(int a0=0;a0
提示:您的代码表明
4
的最大主要因素是
1
。这家伙请求帮助修复他的代码,您的回答就像是“为我编写代码”通过复制代码提问?@DidierL-这是一个专业人士的论坛-我为Java中数字的最大素数问题提供了一个专业的解决方案。那么你为什么不把这个问题作为其他问题的副本来结束呢?请尽量避免只给出代码答案。如果你能解释一下你想展示什么,或者你是否在解决问题中的任何特定问题,那就太好了。非常感谢。我写了有关解决方案的详细信息。@Shree您的解决方案已完成帮助。
if (n==2) return 2;
for (long i = 2; i <= Math.ceil(Math.sqrt(n)); i++)
 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);   
    }
}