Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 22.06.2014
Сообщений: 11

Алгоритм теста на простые числа методом перебора делителей

30.06.2014, 19:20. Показов 8576. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Продолжаю изучать Java, на этот раз получил несколько задач, самая нетривиальная из них оказалась следующей:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;
 
public class algorithm {
 
    public static void main (String [] args) {
    Scanner inp = new Scanner( System.in ); // System.in через сканер
    int number = inp.nextInt(); //ввод числа
    if (number < 2 ) {
        System.out.println("Введите число больше 2");}
 
 
     int[] array = new int[number]; //создаем массив длинною number
 
     // Заполнение массива
     for (int i = 1; i < array.length; i++) {
        array[i] = i;
     }
 
 
 
 
     //поиск простых чисел
     for (int c : array) {
         int j = 2;
         if(j<=Math.sqrt(array[c])) {
                if(array[c] % j==0) {
                    System.out.println("Составное: " + array[c]); }
 
                else {
                    System.out.println("Простое: " + array[c]);}
                }
     }
 
    }
}
Нельзя сказать что этот код не работает вовсе, он работает, но не правильно. Например при введении в консоль числа 13 вывод будет следующим:

13
Составное: 4
Простое: 5
Составное: 6
Простое: 7
Составное: 8
Простое: 9
Составное: 10
Простое: 11
Составное: 12
Несколько нужных чисел выведено не было (3, 13), а не нужное наоборот вывелось (9). Я так понимаю проблема в алгоритме что я написал - используется перебор делителей, взял с вики, наверное неверно его реализовал. Помогите заставить программу работать правильно, буду крайне благодарен!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2014, 19:20
Ответы с готовыми решениями:

Перебором делителей найти простые числа в указанном диапазоне, и вывести все простые числа в поле Memo
Мне нужна программка на Delphi, которая простым перебором делителей находит простые числа в указанном диапазоне и выводит все простые числа...

Алгоритм решения равенства методом перебора ?
Задача такая: Есть равенство - &quot;a ? b ? c ? d = 5&quot;. Подставить вместо &quot;?&quot; операторы +,-,*,/, чтобы решалось уравнение. a,b,c, d - цифры...

Можно ли определить взаимо простые числа, как-то кроме перебора циклами?
на плюсах можно определить взаимо простые числа, както кроме перебора цыклами? потому что с трехзначными числами такой метод кажется...

10
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.06.2014, 19:24
не стОит ходить по int массиву с помощью for (int c : array)
для этого есть обычный перебор по индексу
0
0 / 0 / 0
Регистрация: 22.06.2014
Сообщений: 11
30.06.2014, 19:28  [ТС]
Паблито,
моя программа не работает из-за этого или это просто совет на будущее?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.06.2014, 19:39
и то и другое
0
0 / 0 / 0
Регистрация: 22.06.2014
Сообщений: 11
30.06.2014, 20:12  [ТС]
Паблито,
а что другое? Может подсказали бы, раз знаете?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.06.2014, 20:16
Что еще подсказать?
Это был ответ на вопрос:
Цитата Сообщение от bytesurfer Посмотреть сообщение
моя программа не работает из-за этого или это просто совет на будущее?
вместо
Java
1
for (int c : array) {
перебирать массив надо как выше в коде
Java
1
for (int i = 1; i < array.length; i++) {
0
0 / 0 / 0
Регистрация: 22.06.2014
Сообщений: 11
30.06.2014, 20:22  [ТС]
Паблито, это ничего не дало, вывод точно такой же.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.06.2014, 20:35
это потому что алгоритм весь неверный
эту задачу надо за тебя решить или просто подсказывать словами?
если подсказывать то:
-зачем там вообще массив?
-переменная j лишняя и проверка на четность там лишняя, проще запустить цикл с 1 с шагом 2, а не 1 и обойтись без проверки
-эта строка как читается? if(j<=Math.sqrt(array[c]))
если ДВА меньше чем корень квадратный из ....
что это вообще за бред?

короче я бы этот код вообще вытер, сел и спокойно подумал еще раз, а потом написал все с нуля
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
01.07.2014, 22:01
Вот вам в пример два алгоритма
В первом перебор происходит по всем числам от 2 до данного, так что он не самый быстрый. См. метод isPrime(int)
Второй перебирает только по уже найденным простым числам, следовательно количество итераций уменьшается. См. методы isPrime(int, List<Integer>) и getPrimesBefore(int)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.ArrayList;
import java.util.List;
 
public class JavaConsoleApplication {
    /**
     * Определяет, является ли число простым путём перебора
     * всех натуральных чисел, меньших данного.
     */
    public static boolean isPrime(int number) {
        if (number < 0)
            number = -number;
        if (number == 0) return false;
        for (int i = 2; i < number; i++) {
            if (number % i == 0)
                return false;
        }
        return true;
    }
    
    /**
     * Определяет, является ли число простым перебором 
     * заранее определённых простых чисел.
     */
    public static boolean isPrime(int number, List<Integer> primes) {
        for (int prime : primes) {
            if (number % prime == 0)
                return false;
        }
        return true;
    }
    
    /**
     * Возвращает список простых чисел, не превышающих данное.
     */
    public static List<Integer> getPrimesBefore(int number) {
        List<Integer> primes = new ArrayList<Integer>();
        primes.add(2);
        for (int i = 3; i < number; i++) {
            if (isPrime(i, primes))
                primes.add(i);
        }
        return primes;
    }
    
    public static void main(String[] args) {
        // Простой, но медленный
        for (int i = -5; i < 30; i++) {
            String res = isPrime(i) ? " Простое" : " Составное";
            System.out.println(i + res);
        }
        // Побыстрее
        for (int p : getPrimesBefore(40))
            System.out.println(p);
    }
}
3
7 / 7 / 2
Регистрация: 28.10.2013
Сообщений: 22
02.07.2014, 11:59
Лучший ответ Сообщение было отмечено bytesurfer как решение

Решение

Паблито, ходить при помощи for(int x : array) по массиву можно, но нужно это делать, когда это уместно. У автора темы в этом случае происходит какая-то ерунда. Не по назначению используется сокращенный цикл. Но не в этом суть, в данном случае лучше использовать полный цикл for. А по алгоритмам нахождения простых чисел, вот хорошая тема была Быстрая проверка натурального числа на простоту
Там на c++, но думаю если подумает, то разберется.

Добавлено через 9 минут
bytesurfer, в своем алгоритме ты проверяешь тем более на четность-нечетность больше нежели на простоту.

Добавлено через 10 часов 51 минуту
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.*;
 
public class SimpleNumbers{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int maxNumb = 0;
        while(true){
            System.out.print("Input max number: ");
            try{
                maxNumb = scan.nextInt();
                break;
            }catch(InputMismatchException e){
                System.out.println("Uncorrect input, try again");
                scan.next();
            }
        }
        
        //массив с информацией для каждого числа: простое или нет
        
        boolean[] isSimple = new boolean[maxNumb + 1];
        
        //Заполняем массив будтов все числа простые
        for(int j = 0; j <= maxNumb; j++)
            isSimple[j] = true;
        
        //0 и 1 не простые числа
        isSimple[0] = isSimple[1] = false;
        
        int n = (int)Math.sqrt(maxNumb); 
        
        // j - простое? кратное ему не простое
        for(int j = 0; j <= n; j++){
            if(isSimple[j])
                for(int i = 2 * j; i <= maxNumb; i = i + j) //цикл по кратным простому числу
                    isSimple[i] = false;
        }
        
        for(int j = 3; j <= maxNumb; j++){
            if(isSimple[j])
                System.out.println(j + " - simple");
            else
                System.out.println(j + " - not simple");
        }
        
    }
}
2
0 / 0 / 0
Регистрация: 22.06.2014
Сообщений: 11
03.07.2014, 00:15  [ТС]
Благодарю всех отписавшихся, разобрался с кодом, исправил и всё работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2014, 00:15
Помогаю со студенческими работами здесь

Даны целые числа p и q. Получить все делители числа q, взаимно простые с p, т.е. не имеющие с p общих делителей.
Даны целые числа p и q. Получить все делители числа q, взаимно простые с p, т.е. не имеющие с p общих делителей. Есть в C++ она у вас...

Найти простые числа без проверки делителей
Помогите, пожалуйста, немного улучшить код. Вся проблема в том что i считает кол-во делителей. Оно вроде там и не надо совсем, но без него...

Определить, являются ли натуральные числа A и B взаимно простыми (взаимно простые числа не имеют общих делителей, кроме
Определить, являются ли натуральные числа A и B взаимно простыми (взаимно простые числа не имеют общих делителей, кроме единицы. С++...

Кол-во делителей числа(рекурсивный алгоритм)
Подскажите хотя бы на словах как выглядит рекурсивный алгоритм поиска количества делителей числа

Алгоритм нахождения всех делителей числа
Расскажите пожалуйста как это делается словами?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru