java—打印100到1000之间的素数,其数字和等于19

nxagd54h  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(451)

我有这个问题。我已经写了相同的代码,但我无法找到错误的地方,我做错了。它正在打印100作为输出。

package practicepkg;

import java.util.Scanner;

public class PrimeNumber {

    public static void main(String[] args) {
        System.out.println("Enter the number to check");
        Scanner in = new Scanner(System.in);
        //taking input for 1000
        int number =  in.nextInt();
        int count=0;
        int k,num=100,sum=0;
        //running loop from 100 to till user input(1000)
        for(k=100;k<=number;k++)
        {
            //loop for checking prime number
             for(int i=2;i<(int)(Math.sqrt(number));i++)
                    {
                        if(k%i==0)
                        {
                            count+=1;

                        }
                        //here only taking prime numbers
                        if(count==0)
                        {
                            num=k;
                            //using while loop to calculate sum
                            while(num!=0)
                            {
                                sum=sum+num%10;
                                num=num/10;
                            }
                            //comparing and printing the actual prime number value for k
                            if(sum==19)
                            System.out.println(k);
                        }
                        //resetting the count value to zero for next iteration
                        count=0;    

                     }

        }

    }
}
ycl3bljg

ycl3bljg1#

使用基本的暴力方法,每个素数的和应该重置为0,我们需要在检查完这个数是否为素数后计算和。

public static void main(String[] args) {
    System.out.println("Enter the number to check");
    Scanner in = new Scanner(System.in);
    //taking input for 1000
    int number =  in.nextInt();
    int count=0;
    int k,num=100,sum=0;
    //running loop from 100 to till user input(1000)
    for(k=100;k<=number;k++)
    {
        //loop for checking prime number
         for(int i=2;i<(int)(Math.sqrt(number));i++)
         {
             if(k%i==0)
             {
                 count+=1;
             }                   
         }
         //This should be outside the loop that checks the number for prime
         if(count==0)
         {
             //Sum should be reset for each new prime number
             sum=0;
             num=k;
             //using while loop to calculate sum
             while(num!=0)
             {
                 sum=sum+num%10;
                 num=num/10;
             }
             //comparing and printing the actual prime number value for k
             if(sum==19)
                 System.out.println(k);
         }
         //resetting the count value to zero for next iteration
         count=0;            
    }

}

编辑:上述问题的最佳解决方案。感谢@d george指出这一点

public static void main(String[] args) {
    System.out.println("Enter the number to check");
    Scanner in = new Scanner(System.in);
    //taking input for 1000
    int number =  in.nextInt();
    boolean flag = false;
        int k,num=100,sum=0;
        //running loop from 100 to till user input(1000)
        for(k=100;k<=number;k++)
        {
            //resetting the flag value to false for next iteration
             flag = false;
            //loop for checking prime number
             for(int i=2;i<(int)(Math.sqrt(number));i++)
             {
                 if(k%i==0)
                 {
                     flag=true;
                     break;
                 }                   
             }
             //This should be outside the loop that checks the number for prime
             if(!flag)
             {
                 //Sum should be reset for each new prime number
                 sum = 0;
                 num = k;
                 //using while loop to calculate sum
                 while(num!=0)
                 {
                     sum += num%10;
                     num /= 10;
                 }
                 //comparing and printing the actual prime number value for k
                 if(sum==19) {
                     System.out.println(k);
                 }
             }

        }
 }
eh57zj3b

eh57zj3b2#

你看到的是100到1000之间的数字。在这个范围内,所有以偶数结尾或以5结尾的数字都不是素数,所以你甚至不需要费心去检查它们。素数只能在该范围内以1、3、7或9结尾。
这就产生了伪代码,比如:

for (base <- 100; base < 1000; step 10)
  test(base + 1)
  test(base + 3)
  test(base + 7)
  test(base + 9)
endfor

这可以通过检查 base 初次测试前。你只需要进一步检查 base 是(19-1)、(19-3)、(19-7)或(19-9)之一。这意味着你只需看每10个数字,计算其数字和,检查后面10个数字中的一个或一个潜在素数,就可以跨过100到1000的范围。
你可以通过注意到最小的三位数(数字和为19)是199来节省更多的时间,这样你就可以开始了 base 是190而不是100。

相关问题