Даць спосаб знайсці простыя лікі

I'm trying to write a program that uses a predicate method that finds all the prime numbers between 1-100. I know there are more efficient ways of finding prime numbers but right now but I want to use the brute-force strategy and try every possible combination.

Right now the program as it is, just prints true or false 10,000 times but I want my program to only print the numbers if they are prime. So after the program is done I'll have a list of prime numbers between 1- 100.

1. Is my program correct for what I'm trying to do? 2. What would be good suggesting to change my program so that it lists all the prime numbers between 1-100.

import acm.program.*;
public class PrimeNumbers extends ConsoleProgram{
public void run(){

    for (int i =1; i <= 100, i++){
        for (int j =1; j<= 100; j++){
           println(yesPrime(i, j));
       }
     }
   }

private boolean yesPrime (int n, int k){
      return ( n % k == 0)

       }
    }
  }
1
Вы прапускаеце } пасля таго, як для завес і перад yesPrime метад.
дададзена аўтар Roddy of the Frozen Peas, крыніца
@FDinoff Не, я хачу, каб убачыць, калі п простае лік. Я тэстуюць я супраць J. Гэта тое, што робіць мая праграма?
дададзена аўтар Jessica M., крыніца
Толькі намёк: для таго, каб знайсці простае лік з дапамогай грубай сілы, вы павінны праверыць, калі лік N дзеліцца толькі на 1 і само па сабе. Ваш yesPrime метад не справіцца з гэтым.
дададзена аўтар Luiggi Mendoza, крыніца
<�Код> yesPrime толькі правярае, калі п дзеліцца на к. Гэта сапраўды тое, што вы хочаце?
дададзена аўтар FDinoff, крыніца
@JessicaM. Няма ваша праграма правярае, каб убачыць, калі п дзеліцца на да для ўсіх камбінацыі п ад 1 да 100 і А ад 1 да 100. Адказ Знаёмства Джона
дададзена аўтар FDinoff, крыніца
Вы можаце выкарыстоўваць en.wikipedia.org/wiki/Sieve_of_Eratosthenes
дададзена аўтар Bill, крыніца

11 адказы

Вы не правяралі рыскі. Вы тэставанне ўсіх 10000 камбінацый двух лікаў ад 1 да 100, каб убачыць, калі другі дзеліць першае раўнамерна.

Але гэта, верагодна, рабіць гэта правільна.

Псевдокод для таго, што вы хочаце зрабіць:

for each number n from 2:100
    for each divisor d from 2:n-1
        test to see if d divided n evenly
    end for
    if no values of d other than n divided n evenly
        print "n is prime"
end for

Некалькі аптымізацый для вас задумацца:

  • Ваш ўнутраны цыкл мае толькі падысці да SQRT (п). (Чаму?)
  • Замест таго, каб усе колькасці, вам трэба толькі праверыць, каб убачыць, калі ён дзеліць няцотныя простыя лікі, якія вы ўжо знайшлі раўнамерна. (Чаму?)

Весяліцца!

10
дададзена
@John Калі мая праграма друкуе 10000 сапраўдным або ілжывым, з'яўляецца мая праграма вяртае ісціну, калі гэта здараецца на простае лік? Або мая праграма цалкам няправільна?
дададзена аўтар Jessica M., крыніца
@John дзякуй за наканечнік. Я ўсё яшчэ працую над праблемай не вырашылі яго да гэтага часу, але дзякуй за тлумачэнне.
дададзена аўтар Jessica M., крыніца
@JessicaM. Не. Ён вяртае ісціну, калі п% да == 0 . Гэта азначае, што да Дзяленне п раўнамерна. Як і ў 12% 3 роўна 0. Лік п з'яўляецца простым, калі <�я> не натуральныя лікі менш, чым п падзеліце п раўнамерна, акрамя п і 1. Так што, так, праграма, якую вы размешчаныя не шукае простых лікаў.
дададзена аўтар John, крыніца
Дзякуй! Я дадаў, што ў.
дададзена аўтар John, крыніца
дзельнік д можа знаходзіцца ў дыяпазоне ад 2 да SQRT (п) - гэта эканоміць шмат часу для вялікіх лікаў. Але гэта на самай справе не тое, што важна тут, проста хацеў згадаць пра гэта :)
дададзена аўтар Wayne Uroda, крыніца

Выкарыстоўваючы рэшата Эратасфена:

public static void main(String[] args) {

    int n = 100;//the max number for test

   //Sieve of Eratosthenes
    boolean[] sieve = new boolean[n + 1];
    for (int i = 2; i <= n; i++) {
        sieve[i] = true;
    }
    for (int i = 2; i <= n; i++) {
        if (sieve[i] != false) {
            for (int j = i; j * i <= n; j++) {
                sieve[i * j] = false;
            }
        }
    }

   //Print prime numbers
    for (int i = 0; i <= n; i++) {
        if (sieve[i]) {
            System.out.println(i);
        }
    }

}
3
дададзена
Ну, гэты код не працуе п 157422. Правільны адказ 14475, але гэты код вяртае 14474.
дададзена аўтар AKS, крыніца
Вы змяніць Int зменныя з доўгі зменныя? =)
дададзена аўтар Paul Vargas, крыніца

Ну, вы вяртаеце параўнанне з yesPrime , а затым надрукаваць вынік гэтага параўнання ў Выканаць . Адгадайце, што вынік будзе.

Прымаючы, што гэта заданне, я хацеў бы даць вам падказку замест адказу.

Праверце вынік yesPrime . Калі гэта праўда, надрукаваць нумар і выйсці з цыклу.

1
дададзена
    Scanner reader = new Scanner(System.in);
    System.out.println("Enter the a number");
    int num = reader.nextInt();
    int counter = 0;
    int root = 0;
    boolean prime_flag;

    if (2 <= num) {
       //2 is the only even prime number
        counter++;
    }

    for (int i = 3; i < (num + 1); i++) {

       //test only for odd number
        if (i % 2 != 0) {
            prime_flag = true;
            root = (int) (Math.sqrt(i) + 1);

            for (int j = 3; j < (root + 1); j++) {
                if ((i % j == 0) && (i != j)) {

                    prime_flag = false;
                    break;
                }
            }

            if (prime_flag) {
                counter++;
            }

        }

    }

    System.out.println("Count of prime numbers upto " + num + " is "
            + counter);
1
дададзена

Для пачатку, вам трэба праверыць для простых лікаў, пачынаючы з 2. І вы не праверыць яго на ўсіх 100 нумароў, проста кожны нумар у якасці фактару, пачынаючы з 2-х да (лік-1) .every лік дзеліцца на 1 і само па сабе ,

public static void main(String[] args) {
    boolean b;
    for (int i = 2; i < 100; i++) {
        b = checkPrime(i);
        if (b)
            System.out.println(i);
    }
}

private static boolean checkPrime(int k) {

    for (int i = 2; i < k; i++) {  
//check if the number is divisible by any number starting from 2 till number -1.If it is, it is not a prime number
        if (k % i == 0)
            return false;
    }
// return true if the number is not divisible by any number from 2 to number -1 i.e.  it s a prime number.
    return true;
}
0
дададзена
Mere код не з'яўляецца адказам. Вы павінны даць тлумачэнне. І гэты код ўтрымлівае невытлумачальную надмернасць.
дададзена аўтар EJP, крыніца
Я выдаліў 1 надмернасць. Як паказваюць, калі я прапусціў што-небудзь.
дададзена аўтар Adarsh, крыніца

Я хацеў бы зрабіць функцыю, то, як ваш yesPrime функцыі. Гэта зойме адзін нумар толькі, і праверце, каб убачыць, калі гэта лік з'яўляецца простым.

Нешта накшталт

boolean yesPrime(int n)
{
   //check to see if n is divisble by numbers between 2 and sqrt(n)
   //if the number is divisible, it is not prime, so return false
   //after the loop has checked all numbers up to sqrt(n), n must be prime so return true
}

Затым у асноўнай праграме, цыкл над лікамі ад 1 да 100 і называць yesPrime для кожнага нумара. Калі вынік верны, раздрукуйце гэты нумар.

Мой reaoning з'яўляецца тое, што адна мэта праграмавання разбіць праблемы на больш дробныя подзадачи. Напісаўшы функцыю для праверкі на штрых, вы можаце пазбегнуць выкарыстання ўкладзеных цыклаў ў адной функцыі, якая можа быць цяжэй зразумець.

0
дададзена

знайсці простыя лікі простых ў зададзеным дыяпазоне / * Калі ласка, рэалізаваць гэты метад вяртае спіс усіх простых лікаў у зададзеным дыяпазоне (уключна). Простае лік натуральны лік, якое мае роўна два розных дзельнікаў натуральнага ліку, якія з'яўляюцца 1 і само простае лік. Першыя простыя лікі: 2, 3, 5, 7, 11, 13 * /

public void getPrimeNumbers(int st, int en){
   //int st=1, en=100;
    for(int i=st;i<=en;i++)
        if( (i%2!=0) && (i%1==0 && i%i==0) )
            System.out.println("Yes prime");      
}
0
дададзена
<�Код> я% 1 == 0 і я% я == 0 заўсёды дакладна. Як сказаў Хуан толькі няцотныя лікі друкуюцца. Адказ на гэтае пытанне павінна быць праігнараваны.
дададзена аўтар h3xStream, крыніца
Калі выказаць здагадку, што е гэта першы нумар, а гп апошні нумар інтэрвалу, то гэта будзе проста надрукаваць няцотныя лікі.
дададзена аўтар Juan Carlos, крыніца

Вось маё рашэнне для знаходжання колькасці простых лікаў.

public class PrimeNumberFinder {

    public boolean isPrime(int number) {
        return number > 1 && IntStream.rangeClosed(2, number/2)
                .noneMatch(value -> number % value == 0);
    }
}
0
дададзена

Толькі падумайце аб гэтым логікі
Уся лічба дзеліцца на 2, не з'яўляецца простым, так што вы можаце павялічваць свой нумар на 2
калі лік не дзеліцца на простае лік, то гэта простае лік

паспрабуйце гэты код

public static void main(String[] args) throws IOException
    {
        int[] prime=new int[50];   //array to store prime numbers| within 1 to ==> prime numbers will be <=n/2 here n=100
        int i=1;        //index for "num" array
        int j=1;        //index for storing to "prime" array
        int k=1;        //index for browsing through prime array
        prime[0]=2;    //setting the first element
        int flag=1;    //to check if a number is divisibe for than 2 times
        for(i=3;i<=100;i+=2) {
            for(k=0;prime[k]!=0;k++)    //browsing through the array to till non zero number is encountered
            {
                if(i%prime[k]==0) flag++;   //checking if the number is divisible, if so the flag is incremented 
            }
            if(flag<2)
            {
                prime[j++]=i;              //if the flag is still 1 then the number is a prime number
            }
            flag=1;
        }
        System.out.println(Arrays.toString(prime)); //a short way to print an array
        }
0
дададзена
public static void main(String[] args) {

    boolean isPrime = true;             //set isPrime to true

    for (int i = 2; i<100;i++){         //consider i is increasing number

        for (int j=2; j
0
дададзена
самы просты спосаб зрабіць. Без выкарыстання масіваў і любых IOExceptions, або любы іншы метад.
дададзена аўтар AmanSingh, крыніца

З менш складаным спосабам, мы можам зрабіць гэта:

import java.math.BigInteger;

public class PrimeNumbers {

    public static void main(String[] args) {
        BigInteger min = new BigInteger("2");
        BigInteger max = new BigInteger("100");

        while(min.compareTo(max) < 0){

            System.out.println(min);
            min = min.nextProbablePrime();

        }

    }
}
0
дададзена