Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.11.2023
Сообщений: 1

В массиве найти два числа сумма которых наибольшая и целочисленно делится на 12

28.11.2023, 14:18. Показов 740. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан массив, напишите программу, которая находит 2 числа,сумма которых наибольшая и целочисленно делится на 12, цикл может быть только один.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2023, 14:18
Ответы с готовыми решениями:

Найти два различных числа в массиве, сумма которых наиболее близка к p
Дан массив и число p. Найдите два различных числа в массиве, сумма которых наиболее близка к p.

Даны три числа. Найдите те два из них, сумма которых наибольшая. Переменные создать в динамической памяти
Даны три числа. Найдите те два из них, сумма которых наибольшая. Переменные создать в динамической памяти.

Создать функцию, в которую передается три числа. Найдите те два из них, сумма которых наибольшая и выведите на экран
2.Создать функцию, в которую передается три числа. Найдите те два из них, сумма которых наибольшая и выведите на экран.

13
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
28.11.2023, 15:13
C++
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
bool Find2(int* arr,int n)
{
    bool IsFind=false;
    int sum;
    int i0,j0;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
             int t=arr[i]+arr[j];
             if(t%12==0)
             {
                  if(!IsFind || t>sum)
                  {
                      sum=t;
                      i0=i;
                      j0=j;
                      IsFind=true;
                   }
             }
        }
    }
    if(IsFind)
       cout<<arr[i0]<<' '<<arr[j0];
    else
       cout<<"Not found";
    return IsFound;
}
Остальное см. Образцы (шаблоны) программ для типовых задач
Цитата Сообщение от Avriist Посмотреть сообщение
цикл может быть только один
Один он может быть, если массив отсортирован.
Но для сортировки надо еще 2 цикла.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.11.2023, 15:20
Сергей Сергеевич, а вас 2 цикла.
А вот как это за один цикл сообразить? вот вопрос. Ну т.е. чтобы за один проход, а не квадратично.

Квадратично и один цикл - можно сделать так:
C++
1
2
3
4
5
6
for (k = 0; k < arr_len * arr_len; k++)
{
    i = k / arr_len; // один индекс от 0 до arr_len - 1
    j = k % arr_len;  // второй индекс от 0 до arr_len - 1
.....
}
Но вот чтобы один цикл от 0 до arr_len - не могу я сообразить
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
28.11.2023, 15:55
Думаю, можно отсортировать и как-то выбирать элементы попарно начиная с наибольшего,
но, ведь, для сортировки нужны ещё 2 цикла

А по другому - никак. Перебрать же надо все возможные попарные суммы.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,832
28.11.2023, 20:02
Цитата Сообщение от zss Посмотреть сообщение
А по другому - никак.
Проблема именно с условием, что сумма должна делиться на 12. Ведь, за один цикл можно найти два числа сумма которых наибольшая.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.11.2023, 22:19
Условие дано нам свыше
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,832
28.11.2023, 22:31
KSergey9, тут еще вопрос, что можно считать циклом? Можно ли использовать goto или STL?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
29.11.2023, 07:34
Цитата Сообщение от Royal_X Посмотреть сообщение
Проблема именно с условием, что сумма должна делиться на 12
Можно, конечно, попробовать, но код выглядит совсем некошерно:
C++
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
bool Find2(int* arr,int n)
{
    bool isFind1=false,isFind2=false;
    int max1,max2;
    for(int i=0;i<n;i++)
    {
        int t=arr[i];
        if(t%12==0)
        {
            if(isFind1)
            {
                if(isFind2)
                {
                    if(max1<t)
                    {
                        max2=max1;
                        max1=t;
                    }else
                    {
                        if(max2<t)
                            max2=t;
                    }
                }else
                {
                    isFind2=true;
                    if(max1<t)
                    {
                        max2=max1;
                        max1=t;
                    }else
                    {
                        max2=t;
                    }
                }
            }else
            {
                max1=t;
                isFind1=true;
            }
        }
    }
    int sum=max1+max2;
    if(isFind1 && isFind2)
       cout<<max1<<' '<<max2<<"Сумма="<<s;
    else
        cout<<"Not found";
    return isFind1 && isFind2;
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,832
29.11.2023, 13:30
zss, проверил на {4, 6, 14, 28, 20, 2, 6, 8}, пишет Not found. И это еще очень простой случай.
zss, мне кажется, что за один цикл можно в некоторых случаях найти такие два числа. Но невозможно, чтобы такой код работал во всех случаях.
Я так понимаю, что мы должны иметь две переменные, которые хранят эти два числа. За один цикл можно пройтись по всем числам, и в случае, когда текущий элемент больше этих переменных, то мы проверяем нужно ли нашим переменным (одной из них) присвоить значение текущего элемента, выполнив предварительно проверку на делимость. Если нужно, то меняем их местами, а потом присваиваем. Однако, может возникнуть такой случай, что какой-то элемент, который был бесполезен в начале поиска, может создать максимальную пару с элементов из конца массива. Но ведь, мы уже никак не вернемся в начало и это означает, что мы профукали. Допустим, в начале массива было число 7, а потом были только четные числа, которые не превышали 100, многие из которых создавали пары, которые делятся на 12. Мы отбросили 7, т.к. он не мог создать пару с четными числами. И наоборот, мы смогли найти такие пары с четными числами. И бац, в конце массива число 308369, которое создает пару с 7, но не создает пару с четными числами. За один цикл невозможно предвидеть такие случаи...
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
29.11.2023, 14:09
Я примерно так и сделал перефразировав задание на "Найти два максимальных числа делящихся на 12"
Нюанс, который надо как-то исправить: не оба числа делятся на 12, а только их сумма.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,832
29.11.2023, 14:22
Цитата Сообщение от zss Посмотреть сообщение
перефразировав задание на "Найти два максимальных числа делящихся на 12"
это совсем другое задание, которое точно можно решить за один цикл

Но вот насчет максимальной суммы, которая делится на 12, я не уверен, что это решается за один цикл. Скорее, решается, но количество условий в цикле будет пропорционально количеству элементов в массиве. Такое решение я не считаю решением.
1
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
29.11.2023, 18:32
Цитата Сообщение от Avriist Посмотреть сообщение
цикл может быть только один.
Но это же невозможно.

Добавлено через 45 минут
Но если немного подумать, то...
C++
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
#include <iostream>
#include <cassert>
using namespace std;
 
// В массиве найти два числа сумма которых 
// наибольшая и целочисленно делится на 12
 
int main()
{
  int x[] = {-4, -6, -14, 28, -20, -2, -6, -8}, x1, x2, max = -1;
  auto p1 = x, p2 = x + 1, pe = x + sizeof(x) / sizeof(*x) - 1;
  bool found = false;
  
  do // <----- единственный цикл
  {
    auto sum = *p1 + *p2;
    
    if (!(sum % 12))
    {
      if (!found || found && (sum > max))         
        max = sum, x1 = *p1, x2 = *p2;
      found = true;
    }
 
    if (p2 < pe) p2++;
    else         p1++, p2 = p1 + 1;
  } while (p1 != pe);
  
  assert(!found ^ !(max % 12)); // на всякий случай :)))
 
  if (found) printf("# maximum: %d + %d = %d \n", x1, x2, max);
  else       printf("! NOT FOUND\n");
  
  return 0;
}
Тестируйте, я пошёл готовить ужин. Жрать хочу.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,832
29.11.2023, 19:15
Verevkin, проверил, вроде работает. Но ты жульничаешь. Конечно, у тебя в коде один do-while, но, блет, для 8 элементов твой этот цикл сделал 28 итераций!!! Т.е. он прошелся по элементам 3,5 раза. Разве это можно назвать одним циклом? Это же O(3,5*n). Для 9 элементов вышло 36 итераций O(4*n). Для 10 элементов 45 итераций O(4,5*n). Сложность алгоритма растет... Ахтунг!!!
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
29.11.2023, 19:31
Цитата Сообщение от Royal_X Посмотреть сообщение
Разве это можно назвать одним циклом?
Не знаю.



Пусть оценивает автор задачи.
А я покушал и балдею на кровати под пледиком. А на пузе у меня - кот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2023, 19:31
Помогаю со студенческими работами здесь

Найти два различных числа в массиве, сумма которых наиболее близка к заданному числу
//Дан массив и число &quot;p&quot;. Найдите два различных числа в массиве, сумма которых наиболее близка к &quot;p&quot;. Проблема в том, что я...

Существуют ли два последовательных натуральных числа, сумма цифр каждого из которых делится на 7?
Известна математическая задача: &quot;Существуют ли два последовательных натуральных числа, сумма цифр каждого из которых делится на...

В массиве найти два элемента, стоящих друг за другом, сумма которых больше максимального числа
В массиве D найти, есть ли два элемента, стоящих друг за другом, сумма которых больше максимального числа (максимальное значение массива...

В массиве найти элементы, сумма чисел, которых делится на заданное число
В массиве найти элементы, сумма чисел, которых делится на заданное число

В массиве найти элементы, сумма чисел, которых делится на заданное число
В массиве найти элементы, сумма чисел, которых делится на заданное число


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru