I wrote some code to find prime numbers up to a given number. Could you guys let me know ways to make my code more efficient or better? Or give insight on how I did? In addition, there is a problem in my code where certain numbers repeats twice or three times in a pattern. How do I fix this?
public class PrimeNumber2 {
public static void main(String[] args)
{
int max_prime = 10000;
for(int i = 3; i < max_prime; i+=2)
{
for(int j = 1; j < Math.sqrt(i); j++)
{
if(i % j == 0)
{
System.out.println(i);
}
}
}
}
}
Have a look at:
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
This is quite a nice way of doing it.
Here is some code for you to look at:
public void runEratosthenesSieve(int upperBound) {
int upperBoundSquareRoot = (int) Math.sqrt(upperBound);
boolean[] isComposite = new boolean[upperBound + 1];
for (int m = 2; m <= upperBoundSquareRoot; m++) {
if (!isComposite[m]) {
System.out.print(m + " ");
for (int k = m * m; k <= upperBound; k += m)
isComposite[k] = true;
}
}
for (int m = upperBoundSquareRoot; m <= upperBound; m++) {
if (!isComposite[m]) {
System.out.print(m + " ");
}
}
Here´s a tuned version of yours.
I did put the check if the number is prime into a seperate method. That´s also a part of the reason why your version did print values multiple times, since if it found out that it has a divisor, then it would print the values. (Also you´r algorythm would print basicly everything despite it beeing prime or not, for example it prints 15 and 27).
The reason why it did print multiple values was, that once you found a divisor it would have printed i, but it would continue looping. If it would have found another divisor, it would print i again(you can notice that it does not only print prime numbers).
Here is the fixed version of your´s
public static void main(String[] args) {
if(isPrime(2)) {
System.out.println(2);
}
int max_prime = 10000;
for(int i = 3; i < max_prime; i+=2)
{
if(isPrime(i)) {
System.out.println(i);
}
}
}
private static boolean isPrime(int n) {
if(n<=1) return false;
if(n == 2) return true;
for(int i = 2;i*i<=n;++i) {
if(n%i == 0) return false;
}
return true;
}
Try this.
public class PrimeNumber2 {
public static void main(String[] args)
{
int max_prime = 10000;
System.out.println(2);
L: for (int i = 3; i < max_prime; i += 2)
{
for (int j = 3, max = (int)Math.sqrt(i); j <= max ; j += 2)
{
if(i % j == 0)
{
continue L;
}
}
System.out.println(i);
}
}
}
Here a way using parallelStream
System.out.println(2);
IntStream.range(1, 10000000)
.map(i -> i * 2 + 1)
.filter(i -> (i & 1) != 0 && IntStream.range(1, (int) (Math.sqrt(i)-1)/2)
.map(j -> j * 2 + 1)
.noneMatching(j -> i % j == 0)
.forEach(System.out::println);
Note: the ranges test the n-th odd number.
public static void main(String[] args) {
int upperBound = 30;
List<Integer> primes = new ArrayList<>();
// loop through the numbers one by one
for (int number = 2; number < upperBound; number++) {
boolean isPrimeNumber = true;
// check to see if the number is prime
for (int j = 2; j < number; j++) {
if (number % j == 0) {
isPrimeNumber = false;
break; // exit the inner for loop
}
}
// print the number if prime
if (isPrimeNumber) {
primes.add(number);
}
}
System.out.println("The number of prime is: " + primes.size() + ", and they are: " + primes.toString());
}
possible to dupplicate
get prime numbers and total prime numbers in range
public boolean isPrimeNumber(int number) {
for (int i=2; i<=number/2; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
Related
i have the following code, but the answer is coming out to be 2.
public class Main {
public static void main(String[] args) {
int sum = 0;
int count = 0;
for(int i = 2; i <= 50; i++) {
for(int j = 1; j <= i; j++) {
System.out.println(j);
if(i % j == 0) {
count++;
}
if(count == 2) {
System.out.println(i);
sum = sum + i;
}
}
}
System.out.println("The sum: " + sum);
}
}
You were close. But here is all you need.
first, set sum to 2. It is the only even prime and doing this allows a better increment below
now increment the test cases starting at 3 and incrementing by 2. Skip even values.
now divide by each test case by numbers from 2 to the sqrt(i). No need to go beyond that.
as soon as you have a successful division, end the inner loop and start the next of the outer loop.
otherwise, if the inner loop completes, add i to sum.
int sum = 2;
outer:
for(int i = 3; i <= 50; i+= 2) {
for(int j = 2; j <= Math.sqrt(i); j++) {
if(i % j == 0) {
continue outer;
}
}
sum += i;
}
System.out.println("The sum: " + sum);
An improvement would be to store the primes as they are found and then only divide by those instead of arbitrary numbers.
Disclaimer: this code was written by Github Copilot with minimal supervision.
class Scratch {
// find the sum of all prime numbers between 2 and n
public static int sumPrimes(int n) {
int sum = 0;
for (int i = 2; i < n; i++) {
if (isPrime(i)) {
sum += i;
}
}
return sum;
}
// return true if n is prime
public static boolean isPrime(int n) {
if (n == 2) {
return true;
}
if (n % 2 == 0) {
return false;
}
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// print sum of primes between 2 and 50
System.out.println("The sum: " + sumPrimes(50));
}
}
Prints:
The sum: 328
Maybe a minimal version with recursive method based on Aivean response:
class Scratch {
// find the sum of all prime numbers between 2 and n
public static int sumPrimes(int n) {
if (n >= 2) {
return (isPrime(n) ? n : 0) + sumPrimes(n-1);
}
return 0;
}
// return true if n is prime
public static boolean isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// print sum of primes between 2 and 50
System.out.println("The sum: " + sumPrimes(50));
}
}
I wrote the following code:
package primelessthanN;
public class Main {
public static void main(String[] args) {
int j;
int n;
n = 10;
for (j = 3; j <=n; j++) {
if (isPrime(j))
System.out.println(j);
}
}
private static boolean isPrime(int m) {
for (int i = 3; i <=m; i++) {
if (m % i == 0)
return false;
}
return true;
}
}
I do not know why it doesn't work and I am a little bit nervous.
Could any of you help me please and tell me where it is my mistake?
There are two problems:
In main you iterate from 3 to sqrt(n), but you have to start from 2 (which is a prime) and iterate to n
for (j = 2; j <=n; j++) {
if (isPrime(j)) {
System.out.println(j);
}
}
In isPrime you have to start the iteration from 2 since it is a prime number too.
for (int i = 2; i <= sqrt(m); i++) {
if (m % i == 0)
return false;
}
return true;
public class assignment6part3 {
public static void main(String[] args) {
int q = 0;
for ( int count=1; count <= 10000; count++) {
if (Prime(count)) {
q = q + 1;
}
}
System.out.println("It comes out " + q + " times.");
}
public static boolean Prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 1; i < Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
I'm trying to get the number of prime numbers between 0 and 10000, but when I run this, it says there are 0 prime numbers. What part of the code is causing this error?
Inside your function Prime your for loop runs like ::
for(int i = 1; i < Math.sqrt(n); i++), starting from i = 1 and every number is divisible by 1 and hence 0 prime numbers.. :P
Initialization condition for i shall be i = 2
Other things you might consider changing ::
for (int i = 1; i < Math.sqrt(n); i++) shall be changed to
for (int i = 1; i <= Math.sqrt(n); i++)
NOTE :: A more optimal way to find Primes would be https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
The code is returning false before it actually checks the numbers, because every number is divisible by 1. Also, in some cases such as 25 and 49, the factors are not less than the square root. Try this:
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
I have the following code which spits out prime numbers between 1 and N. A friend came up with this solution but I believe there is a more efficient way to write this code. Such as making it so that if (i%j!=0) {System.out.print (i + " ");}. However I found this spat out numbers randomly all over the place...
import java.util.Scanner;
public class AllPrime {
public static void main(String[] args) {
System.out.println("Enter a number:\n");
Scanner input = new Scanner(System.in);
int a = input.nextInt();
for (int i = 2; i < a; i++) {
boolean primeNum = true;
for(int j=2; j<i; j++) {
if (i%j==0) {
primeNum =false;
}
}
if (primeNum) {
System.out.print(i + " ");
}
}
}
}
Look at proper sieves, like the Sieve of Eratosthenes. You don't need to be checking for % each time.
for(int j=2; j<i; j++) {
if (i%j==0) {
primeNum =false;
}
}
This is not a very efficient algorithm, but at the very least, put a break in there...
public static boolean [] createPrimes (final int MAX)
{
boolean [] primes = new boolean [MAX];
// Make only odd numbers kandidates...
for (int i = 3; i < MAX; i+=2)
{
primes[i] = true;
}
// ... except No. 2
primes[2] = true;
for (int i = 3; i < MAX; i+=2)
{
/*
If a number z is already eliminated
(like No. 9), because it is a multiple of -
for example 3, then all multiples of z
are already eliminated.
*/
if (primes[i] && i < MAX/i)
{
int j = i * i;
while (j < MAX)
{
if (primes[j])
primes[j] = false;
j+=2*i;
}
}
}
return primes;
}
updated after comment of Will Ness:
Improves the speed to about 2/1, it checks 100 Million ints in 5s on my 2Ghz single core.
private static void generatePrimes(int maxNum) {
boolean[] isPrime = new boolean[maxNum + 1];
for (int i = 2; i <= maxNum; i++)
isPrime[i] = true;
// mark non-primes <= N using Sieve of Eratosthenes
for (int i = 2; i * i <= Math.sqrt(maxNum); i++) {
// if i is prime, then mark multiples of i as nonprime
if (isPrime[i]) {
for (int j = i; i * j <= maxNum; j++)
isPrime[i * j] = false;
}
}
// count primes
int primes = 0;
for (int i = 2; i <= maxNum; i++)
if (isPrime[i]) {
System.out.println("Prime - " + i);
primes++;
}
System.out.println("The number of primes <= " + maxNum + " is "+ primes);
}
I am new here. I am trying to solve this exercise Problem 18 just for reinforcing my solving skills. I've already coded the answer. The task asks for "How many of the primes below 1,000,000 have the sum of their digits equal to the number of days in a fortnight?" (a fortnight is 14 days). My answers is 16708, but it is wrong. I hope you can help me. I don't know what my error is. I have 2 methods, 1 for generating the primes, and another for counting the digits of each prime.
This is my code:
import java.util.ArrayList;
import java.util.List;
public class Problema18 {
public static void main(String args[]) {
ArrayList<Integer> num = primes();
System.out.println(num);
count(primes());
}
public static ArrayList<Integer> primes() {
List<Integer> primes = new ArrayList<Integer>();
primes.add(2);
for (int i = 3; i <= 1000000; i += 2) {
boolean isPrime = true;
int stoppingPoint = (int) (Math.pow(i, 0.5) + 1);
for (int p : primes) {
if (i % p == 0) {
isPrime = false;
break;
}
if (p > stoppingPoint) { break; }
}
if (isPrime) { primes.add(i); }
}
// System.out.println(primes);
return (ArrayList<Integer>) primes;
//System.out.println(primes.size());
}
public static void count(ArrayList<Integer> num) {
int count = 0;
for (int i = 0; i <= num.size() - 1; i++) {
int number = num.get(i);
String num1 = String.valueOf(number);
int sum = 0;
for (int j = 0; j < num1.length(); j++) {
sum = Integer.parseInt(num1.charAt(j) + "") + sum;
if (sum == 14) { count++; }
}
System.out.println(sum);
}
System.out.println(count);
}
}
You should check whether sum == 14 outside the inner for loop. What happens now is that you also count those primes for which the sum of digits is larger than 14 but the sum of the digits in some prefix of the prime is equal to 14.
This part...
if (sum == 14) {
count++;
}
should be outside the inner for-loop - i.e. you want to do it each time you pass through the i for-loop, but not each time you pass through the j for-loop.
Like this:
public static void count(ArrayList<Integer> num) {
int count = 0;
for (int i = 0; i <= num.size() - 1; i++) {
int number = num.get(i);
String num1 = String.valueOf(number);
int sum = 0;
for (int j = 0; j < num1.length(); j++) {
sum = Integer.parseInt(num1.charAt(j) + "") + sum;
}
System.out.println(sum);
if (sum == 14) {
count++;
}
}
System.out.println(count);
}