Вложенные "FOR-петли" не работают - PullRequest
2 голосов
/ 11 декабря 2011

Я делаю упражнение в книге «Java как программировать».Упражнение хочет, чтобы я написал метод, который определяет, является ли число «простым».(«Простое число» - это положительное целое число, которое делится только на себя и 1).Затем я должен реализовать метод в приложении, которое отображает все целые числа до 10 000. Я использую «двойные значения», чтобы проверить, равен ли остаток 0 или нет, чтобы проверить делимость.В любом случае, я просто не заставляю программу работать, она отображает все числа 3, с указанием, сколько раз будет отображаться каждое число (3 44 555 и т. Д.).Может кто-нибудь сказать, пожалуйста, что я делаю не так?

Код следующий:

public class Oppgave625 
{

public static void main(String[] args) 
{
for(double a = 2; a <= 10000; a++)
    {
    for(double b = 1; b < a; b++)
        {
        if (prime(a, b) !=0)
            {
            System.out.printf("%.0f ", prime(a, b));
            }
        }

    }

}

static double prime(double x, double y)
{
if (x % y != 0)
    {
    return x;
    }
else
    {
    return 0;
    }
}

}

Ответы [ 6 ]

3 голосов
/ 11 декабря 2011

Используйте вместо этого int.double не подходит для этой цели

вы можете прочитать эту статью , чтобы понять использование оператора% для чисел с плавающей запятой.

1 голос
/ 12 декабря 2011

На самом деле, здесь было много отдельных ошибок. Я сократил функцию prime() до такой степени, что это была только операция по модулю, поэтому я смог ее встроить. Во-вторых, я инвертировал тест, чтобы он проверял числа, у которых нет , есть остаток, и переходит к следующему числу, как только он находит делитель. В-третьих, я изменил b = 1, чтобы мы не проверяли числа, делимые на 1, потому что это привело бы ко всем числам. Наконец, я только распечатываю числа, для которых мы не открываем делитель. Окончательный результат:

public static void main(String[] args) {
    outer:
    for (int a = 2; a <= 1000; a++) {
        for (int b = 2; b < a; b++) {
            if (a % b == 0) {
                continue outer;
            }
        }
        System.out.println(a);
    }
}

Редактировать: Я забыл упомянуть, я также изменил типы с плавающих на целые, поскольку я уверен, что это то, что вы имели в виду.

1 голос
/ 11 декабря 2011

Здорово, что вы разместили пример кода для этого, но есть несколько вещей, которые не так:

  • вы не должны использовать для этого тип с плавающей запятой, а int или long. Типы с плавающей точкой никогда не должны использоваться для точных значений.

  • вы делаете два вызова своей основной функции, фактически удваивая необходимые шаги

  • ваша основная функция только сообщает вам, делят ли два числа поровну, она не говорит вам, простое ли это число или нет

  • для простых чисел, вы должны использовать более эффективный алгоритм вместо того, чтобы вычислять одни и те же значения снова и снова для каждого числа. Посмотрите вверх Сито Эратосфена .

0 голосов
/ 09 июля 2019
   boolean isPrime = true;
    for (int i = 2; i<=100; i++){
     for(int j = 2; j<=i/2; j++){
        isPrime = true;
         if (i%j==0){
           isPrime = false;
             break;
             }
            }
            if (isPrime){
                Log.d("PrimeNumber",""+i);
            }
        }
0 голосов
/ 11 декабря 2011

Простое число - это число, которое делится только на одно и на себя. То есть: один номер. Ваш код сравнивает два числа, как в евклидовом алгоритме для проверки взаимности . Это очень отличается от тестирования, если число простое .

Ваш код должен выглядеть примерно так:

for i = 2 to 10,000 {
    if( isPrime(i) ){
        print i
    }
}

function isPrime( int n ){
    for i = 2 to n {
        next if i == n
        if( n % i == 0 ){
            return 0;
        }
    }
    return 1;
}
0 голосов
/ 11 декабря 2011

Вы подходите к проблеме следующим образом: число A НЕ простое, когда я могу найти число B, которое может разделить A без остатка. Но прямо сейчас вы распечатываете А, когда она не делится на Б.

Вместо этого вы можете сказать: всякий раз, когда A не делится на B, увеличивайте B. Когда я нашел B для деления A, выйдите из внутреннего цикла, ничего не печатая. Когда я не нашел B, выведите A и выйдите из цикла.

Кроме того, вам нужно только проверить делимость A до (a / 2) -1.

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