firesoup
firesoup

Reputation: 11

Find all positive integers with at least one 7 and 9 under 1,000,000 but how to fix duplicates?

So, for class I have to code a program that determines how many positive integers are 1) Under 1,000,000 2) Have at least one 7 and a 9 in the number 3) Has to be done with the brute-force method.

While the answer is supposed to be 199,262, I keep getting 228530 due to duplicates, can someone take a look to see where I went wrong here? Thanks!

Similar problem but not the same: Java - numbers with at least one 7 and one 9 in its digit

boolean sevNine = false; // a combination of seven and nine in a number
boolean oneNine;
boolean oneSeven;
int counter = 0;
for (int i = 0; i<1000000; i++) //Runs numbers 1-1000000
{
    oneSeven = false;
    oneNine = false;
    String number2 = " " + (i); //sets a nmber to a string
    int length = number2.length()  -1; //length goes up to the last character 0-j
    for (int j= 0; j <= length; j++) //looking for the first 7 or 9 in string 
    {
        char a = number2.charAt(j); //sets char to the next "letter"
        if (a == '7' && oneSeven != true) //if the number is a 7 and there isnt already a seven
        {
            oneSeven = true; //now there is a seven, 
            for (int k = j+1; k <= length; k++) //checks from the next char up to the length for a 9
            {
                char b = number2.charAt(k);
                if (b == '9') 
                {
                     sevNine = true;
                }
            }           
        }
        else if (a == '9' && oneNine != true)
        {
            oneNine = true;
            for (int l = j+1; l <= length; l++)
            {
                char b = number2.charAt(l);
                if (b == '7')
                {
                    sevNine = true;
                }
            }     
        }
        if (sevNine == true)
        {
            counter++;
            sevNine = false;
            System.out.println(number2);

        }

    }
}
System.out.println(counter);

Upvotes: 0

Views: 117

Answers (2)

user2173372
user2173372

Reputation: 513

In Java 8 you can try:

public static void main(String[] args) {
    final long count = IntStream.rangeClosed(0, 10_00_000)
            .filter(i -> String.valueOf(i).contains("7") && String.valueOf(i).contains("9"))
            .count();
    System.out.println(count);
}

Upvotes: 1

Arpan
Arpan

Reputation: 71

You are not breaking out of the loop once the sevNine is set to true and you increment the counter, so it keeps iterating over each digit on the same number even if it has already included the number... Just add a break statement to exit the for loop iterating over each digit once you increment the counter...

Here's the code.

public static void main(String[] args) {
    boolean sevNine = false; // a combination of seven and nine in a number
    boolean oneNine;
    boolean oneSeven;
    int counter = 0;
    for (int i = 0; i < 1000000; i++) // Runs numbers 1-1000000
    {
        oneSeven = false;
        oneNine = false;
        String number2 = " " + (i); // sets a nmber to a string
        int length = number2.length() - 1; // length goes up to the last character 0-j
        for (int j = 0; j <= length; j++) // looking for the first 7 or 9 in string
        {
            char a = number2.charAt(j); // sets char to the next "letter"
            if (a == '7' && oneSeven != true) // if the number is a 7 and there isnt already a seven
            {
                oneSeven = true; // now there is a seven,
                for (int k = j + 1; k <= length; k++) // checks from the next char up to the length for a 9
                {
                    char b = number2.charAt(k);
                    if (b == '9') {
                        sevNine = true;
                    }
                }
            } else if (a == '9' && oneNine != true) {
                oneNine = true;
                for (int l = j + 1; l <= length; l++) {
                    char b = number2.charAt(l);
                    if (b == '7') {
                        sevNine = true;
                    }
                }
            }
            if (sevNine == true) {
                counter++;
                sevNine = false;
                System.out.println(number2);
                break;
            }
        }
    }
    System.out.println(counter);
}

If you run with the break statement, you should get 199262 as the resulting number.

Upvotes: 0

Related Questions