Найти все натуральные числа с хотя бы одним 7 и 9 под 1 000 000, но как исправить дубликаты? - PullRequest
0 голосов
/ 26 ноября 2018

Итак, для класса я должен написать программу, которая определяет, сколько положительных целых чисел 1) Меньше 1 000 000 2) Иметь хотя бы одну цифру 7 и 9 в 3) Должно быть сделано методом грубой силы.

Хотя предполагается, что ответ будет 199,262, я продолжаю получать 228530 из-за дубликатов, может кто-нибудь взглянуть, чтобы увидеть, где я ошибся здесь?Спасибо!

Аналогичная проблема, но не та же: Java - числа, в которых по крайней мере одна цифра 7 и одна цифра 9

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);

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В Java 8 вы можете попробовать:

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);
}
0 голосов
/ 26 ноября 2018

Вы не выходите из цикла, если для sevNine установлено значение true, и вы увеличиваете счетчик, поэтому он продолжает перебирать каждую цифру на одном и том же номере, даже если он уже включил число ... Просто добавьтеоператор break для выхода из цикла for, повторяющегося над каждой цифрой после увеличения счетчика ...

Вот код.

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);
}

Если вы запустите оператор break, вы должны получить199262 как полученное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...