Java 3号工程

Java 3号工程,java,Java,首先,这不是家庭作业。。。在课堂外进行这项工作,以获得一些java实践 public class Problem3 { public static void main(String[] args) { int n = 13195; // For every value 2 -> n for (int i=2; i < n; i++) { // If i is a multiple of n if (n % i == 0

首先,这不是家庭作业。。。在课堂外进行这项工作,以获得一些java实践

public class Problem3 {
public static void main(String[] args) {    
    int n = 13195;

    // For every value 2 -> n
    for (int i=2; i < n; i++) {
        // If i is a multiple of n
        if (n % i == 0) {
            // For every value i -> n
            for (int j=2; j < i; j++) {
                if (n % j != 0) {
                    System.out.println(i); 
                    break;
                }
            }
        }
    }
  }
}
公共类问题3{
公共静态void main(字符串[]args){
int n=13195;
//对于每个值2->n
for(int i=2;in
对于(int j=2;j
我不断修改代码,试图让它做我想要的

正如问题所说,你应该得到5分、7分、13分和29分

我得到这些值,加上35、65、91、145、203、377、455、1015、1885和2639。我想我走对了,因为我有所有正确的数字。。。只需要一些额外的

在检查一些数字是否可以被n整除和是否是素数时,这里的问题是多余的数字不是素数。不知道发生了什么事

如果有人有任何见解,请分享。

此部分

for (int j=2; j < i; j++) {
    if (n % j != 0) {
        System.out.println(i); 
        break;
    }
for(int j=2;j
不检查
i
是否为素数。除非
i
很小,否则在某个点上,它将始终打印
i
,因为有小于
i
的数字不会除以
n
。因此基本上,这将打印出
n
的所有除数(例如,它不会为
n==12
打印除数
4
,但这是一个例外)


还要注意的是,该算法-使用
long
而不是
int
来避免溢出-即使固定为检查除数
i
是否是决定是否打印它的首要因素,对于实际目标来说,运行该算法也需要很长时间。您应该研究以找到更好的算法(提示:您可能希望找到完整的素数因子分解)。

蛮力也可以用于检查此问题的因子是否为素数。。。 例如

(i=1;i=1;j--)的

{
如果(i%j==0)
{ 
计数器+++;//在之前设置计数器=0。
}
if(counter==2)//对于素数因子,计数器总是正好是2。
{
系统输出打印LN(i);
}
计数器=0;
}
}

我用Java解决了这个问题,看看我的解决方案显而易见的建议是开始使用BigInteger,看看Java.math.BigInteger的文档


这些问题中有很多是“数学”问题,就像它们是“计算机科学”一样因此,在提出算法之前,要更多地研究数学,确保你对数学有相当好的理解。蛮力有时可以奏效,但这些问题往往有一些诀窍。

不了解Java,但这是我的C代码,如果有帮助的话。

# include <stdio.h>
# include <math.h>

// A function to print all prime factors of a given number n
void primeFactors(long long int n)
{
// Print the number of 2s that divide n
while (n%2 == 0)
{
printf("%d ", 2);
n = n/2;
}
int i;
// n must be odd at this point. So we can skip one element (Note i = i +2)
for ( i = 3; i <= sqrt(n); i = i+2)
{
// While i divides n, print i and divide n
while (n%i == 0)
{
printf("%d ", i);
n = n/i;
}
}

// This condition is to handle the case whien n is a prime number
// greater than 2
if (n > 2)
printf ("%ld ", n);
}

/* Driver program to test above function */
int main()
{
long long int n = 600851475143;
primeFactors(n);
return 0;
}
#包括
#包括
//打印给定数n的所有素数因子的函数
空隙系数(长整型n)
{
//打印除以n的2的数量
而(n%2==0)
{
printf(“%d”,2);
n=n/2;
}
int i;
//n在这一点上必须是奇数,所以我们可以跳过一个元素(注i=i+2)
对于(i=3;i=2)
printf(“%ld”,n);
}
/*用于测试上述功能的驱动程序*/
int main()
{
长-长整数n=600851475143;
原始因子(n);
返回0;
}

很好,你在课外处理这些问题。 看到了您的代码。您正在主函数/线程中编写过程代码。 相反,先编写函数并按算法一步一步地思考。 解决此问题的简单算法如下所示:

  • 1) 从最小素数2到13195/2连续生成数字。(任何数字的因子始终小于其值的一半)
  • 2) 检查生成的数字是否为素数
  • 3) 如果数字是素数,则检查它是否是13195的因数
  • 4) 返回最后一个素因子,因为它将是13195的最大素因子
另一个建议是尝试编写单独的函数以避免代码复杂性。 代码是这样的

    public class LargestPrimeFactor {

public static long getLargestPrimeFactor(long num){

   long largestprimefactor = 0;

   for(long i = 2; i<=num/2;i++){

       if(isPrime(i)){

           if(num%i==0){


               largestprimefactor = i;

               System.out.println(largestprimefactor);

           }            
       }              
   }

   return largestprimefactor;

}

public static boolean isPrime(long num){

    boolean prime=false;
    int count=0;
    for(long i=1;i<=num/2;i++){

        if(num%i==0){


            count++;

        }
        if(count==1){

            prime = true;

        }
        else{

            prime = false;
        }           
    }

    return prime;

}



public static void main(String[] args) {

    System.out.println("Largest prime factor of 13195 is "+getLargestPrimeFactor(13195));

} 
public类最大的primefactor{
公共静态long getLargestPrimeFactor(long num){
长最大初始因子=0;

对于(长i=2;我“玩电脑”。在纸上画出执行情况,写下循环值、数学条件的结果等。或者,使用调试器,但我写下来会占用更多的大脑。注意,对于最后一个问题(600851475143),您将需要使用
long
而不是
int
-1 project Euler的规则之一是不散布答案。@b您看不到任何答案,除了问题页面上提供的答案之外。
    public class LargestPrimeFactor {

public static long getLargestPrimeFactor(long num){

   long largestprimefactor = 0;

   for(long i = 2; i<=num/2;i++){

       if(isPrime(i)){

           if(num%i==0){


               largestprimefactor = i;

               System.out.println(largestprimefactor);

           }            
       }              
   }

   return largestprimefactor;

}

public static boolean isPrime(long num){

    boolean prime=false;
    int count=0;
    for(long i=1;i<=num/2;i++){

        if(num%i==0){


            count++;

        }
        if(count==1){

            prime = true;

        }
        else{

            prime = false;
        }           
    }

    return prime;

}



public static void main(String[] args) {

    System.out.println("Largest prime factor of 13195 is "+getLargestPrimeFactor(13195));

}