• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

Указатели и Ссылки в С++

V

Vadimisprice

Даны N положительных целых чисел, которые не делятся ни на какие простые числа, кроме 2 и 3. Требуется удалить из массива минимально возможное количество чисел так, чтобы из любых двух оставшихся одно делилось на другое
 

sinner67

Green Team
24.03.2017
279
357
BIT
0
я сейчас пока что не могу написать в коде, но алгоритм был бы у меня такой:
1) Сортировать массив N по возрастанию.
2) Пусть максимальное число это M. Тогда бежим по массиву от M - 1 к первому элементу.
3) Если i-й элемент НЕ делится на M без остатка, то удаляем его из N.
4) То же самое проделываем с новополучившимся массивом, но М меняем на М - 1
5) Делаем это до тех пор пока не проверим каждую цифру.
В итоге получится массив чисел, каждое из которых делится на простые числа 2 и 3, и любые два взятые числа делятся друг на друга.
Попозже напишу в коде.
 
Последнее редактирование:

sinner67

Green Team
24.03.2017
279
357
BIT
0
Совсем вылетело из головы.
Вот как бы я написал все это:
Код:
#include<iostream>
 
using namespace std;
 
int main()
{
   //Пусть есть некоторый массив удовлетворяющий условиям задачи
   int N = 9;
   int *arr = new int[N];
   arr[0] = 24;
   arr[1] = 12;
   arr[2] = 18;
   arr[3] = 6;
   arr[4] = 36;
   arr[5] = 96;
   arr[6] = 54;
   arr[7] = 72;
   arr[8] = 48;
  
  
   //Отсортируем его по возрастанию
   for (int i = 0; i < N - 1; i++)
       for (int j = i + 1; j < N; j++)
           if (arr[i] > arr[j]){
               int buff = arr[i];
               arr[i] = arr[j];
               arr[j] = buff;
           }
          
       //Убираем элементы не подходящие нам по условию   
    for (int i = N - 1; i >= 0; i--) //Начинаем перебор с самого большого числа в массиве.
        for (int j = 0; j < i; j++) //Проверяем все оставшиеся элементы на выполнения условия
            if (arr[i] % arr[j] != 0){ //Если не выполняется деления без остатка на j
                for (int k = j; k < N - 1; k++)
                    arr[k] = arr[k + 1];//то затираем значение массива с индексом j, следующим за ним.
                N--;//Уменьшаем размер массива.
            }
    //Выводим результат.
    for (int i = 0; i < N; i++)   
       cout << arr[i] << " ";
    
     delete [] arr;
return 0;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!