Stefan Orie
Stefan Orie

Reputation: 604

Finding specific number in prime number array

I'm trying to find prime numbers with a specific condition in Java.

The challenge is to show all the prime numbers (under 100.000) which contain a '3' four times. I already have a code which shows all the prime numbers under 100.000, but I can't seem to figure out how to count the ones that contain the number '3' four times. I can however count all the prime numbers.

Can someone help me with this?

Here's the code I have, where am I going to put the numbers into strings?

    package Proeftentamen;

import java.util.regex.*;

/**
 *
 * @author Stefan
 */
public class Vraag_6 {

    /// priemgetallen waar 4x een 3 in voor komt???? wtf...
    public static void main(String[] args) {
        boolean[] lijst = new boolean[1000000]; // hoeveelheid getallen
        vularray(lijst);
        lijst = zeef(lijst);
        drukaf(lijst);
    }

    public static void vularray(boolean[] lijst) {
        for (int i = 2; i < lijst.length; i++) {
            lijst[i] = true;
        }
    }

    public static boolean[] zeef(boolean[] lijst) {
        for (int i = 2; i < lijst.length / 2; i++) {
            if (lijst[i]) {
                for (int j = 2 * i; j < lijst.length; j += i) {
                    lijst[j] = false;
                }
            }
        }
        return lijst;
    }

    public static void drukaf(boolean[] lijst) {
        int count = 0;
        for (int i = 2; i < lijst.length; i++) {
            if (lijst[i] == true) {
                System.out.println(i + " " + lijst[i]);
                count++;
            }
        }
        System.out.println("Aantal priemgetallen: " + count);
    }
}

Upvotes: 2

Views: 1091

Answers (6)

Will Ness
Will Ness

Reputation: 71099

you only have at most five digits, four of which must be 3. So what can you say about the remaining digit?

It's not hard to just write out the resulting numbers by hand, and then test each one for primality. Since there are no more than 50 numbers to test, even the simplest trial division by odds will do.

But if you want to generate the numbers programmatically, just do it with 5 loops: add 10,000 to 03333 9 times; add 1,000 to 30333 9 times; add 100 to 33033 9 times; etc. In C++:

int results[50];
int n_res = 0;
int a[5] = {13333, 31333, 33133, 33313, 33331};
for( int i=0, d=10000; i<5; ++i, d/=10)
  for( int j=1; j<9; ++j, a[i]+=d )
    if( is_prime(a[i]) )
      results[n_res++] = a[i];

Upvotes: 0

Pooya
Pooya

Reputation: 4481

This code generate 50 permutation of numbers that has four '3' in it's digits so check each number that is prime or not

public void generateNumbers() {
    StringBuilder s = new StringBuilder();
    s.append("3333");
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j <= 9; j++) {
            if (j%3==0) continue;
            s.insert(i,String.valueOf(j));
            int number=Integer.parseInt(s.toString());
            System.out.println(number);
            s.delete(i,i+1);
        }
    }


}

Upvotes: 3

user448810
user448810

Reputation: 17866

Using the primes function from an exercise on the Sieve of Eratosthenes, as well as the digits and filter functions from the Standard Prelude, this Scheme expression finds the seven solutions:

(filter
  (lambda (n)
    (= (length
         (filter
           (lambda (d) (= d 3))
           (digits n)))
       4))
  (primes 100000))

The outer filter runs over all the primes less than 100000 and applies the test of the outer lambda to each. The inner filter computes the digits of each prime number and keeps only the 3s, then the length function counts them and the equality predicate keeps only those that have 4 3s. You can run the program and see the solution at http://codepad.org/e98fow2u.

Upvotes: 0

amicngh
amicngh

Reputation: 7899

Please refer below code to validate all such prime numbers.

void getPrimes(int num ,int frequency,char digit) {

    int count = 0;
    String number=Integer.toString(num);

    for (int i = 0; i < number.length(); i++) {
        if (count < frequency) {
            if (number.charAt(i) == digit)
                count++;
        }
        if (count == frequency)
        {
            System.out.println(number);
            return ;
        }

    }

}

Upvotes: 0

Mark Bramnik
Mark Bramnik

Reputation: 42511

This question really sounds like a homework, so you should write down what you have come up with and what you tried so far.

There are a lot of ways to count numbers. Just to give you a clue, you can use the reminder operation (in Java - %):

56 % 10 = 6
25 % 5  = 0

So, when you divide by 10 and use a reminder operation you can get the last digit of your number. Now use a loop and counter and you'll be fine.

Another option (very ugly, so don't really use it :) ) - to turn your number into a String and iterate (loop) over its characters.

Hope this helps and good luck!

Upvotes: 3

algorowara
algorowara

Reputation: 1720

  1. Iterate across each prime number.
  2. For each prime number, convert it to a string using the Integer.toString(int) static method.
  3. With this string, iterate over every character (use a for loop and the non-static method String.charAt(int index)) and count the number of times that method returns '3'. (The character '3', not the String "3").

Unless you have some other purpose for an array of prime-number Strings, don't bother to store them anywhere outside the loop.

Upvotes: 1

Related Questions