С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Darky
Быдлокодер
508 / 295 / 84
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
1

Два задания по одномерным массивам.

29.11.2009, 07:19. Просмотров 1036. Ответов 9
Метки нет (Все метки)

1.
Дан вещественный массив А[N]. Определить количество и индексы тех элементов массива, которые меньше элементов, стоящих в соседних позициях справа и слева, но больше минимального элемента массива.

2.
Дан целочисленный массив А[N]. Найти элемент массива с максималь-ной суммой делителей. Вывести на экран значение найденного элемента и его порядковый номер в массиве.


Лучше всего описать алгоритм. Надеюсь на Вашу помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2009, 07:19
Ответы с готовыми решениями:

Задания по одномерным массивам.
Прошу помочь.. 1. Дана последовательность целых чисел a1,a2, ..., an....

Задача по одномерным массивам
Сформировать одномерный массив целых чисел а, используя датчик случайных чисел....

Вопрос по одномерным массивам.
Всем доброго времени суток. 1. Написал код но при запуске выкидывает ошибку...

задача по одномерным массивам
1) Условие задачи: В массиве A определить среднюю длину непрерывных участков...

Задача по одномерным массивам
Помогите плиз решить задачу по одномерным массивам в C++ "Дан массив целых...

9
valeriikozlov
Эксперт С++
4687 / 2513 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
29.11.2009, 08:40 2
Я тоже верю, что Вам хватит одного алгоритма.
Цитата Сообщение от Darky Посмотреть сообщение
1.
Дан вещественный массив А[N]. Определить количество и индексы тех элементов массива, которые меньше элементов, стоящих в соседних позициях справа и слева, но больше минимального элемента массива.
Если не использовать доп. массивы, то однозначно здесь два прохода: в первом ищем минимальный элемент (заносим его в переменную min). Во втором проходе ищем элементы (A[i-1]>A[i] && A[i]<A[i+1] && A[i]>min). Если такие находим, то выводим на экран i, и еще count++ (счетчик элементов подходящих под условие). В конце выводим на экран count. Второй проход ограничен так for(i=1; i<N-1; i++), что бы не выйти за границы массива.

Добавлено через 20 минут
Цитата Сообщение от Darky Посмотреть сообщение
2.
Дан целочисленный массив А[N]. Найти элемент массива с максималь-ной суммой делителей. Вывести на экран значение найденного элемента и его порядковый номер в массиве.
Вторая будет по объемней насчет кода, но решается за один проход. Завести придется переменные (это не все переменные,которые придется заводить, я здесь выделяю только те, котрые необходимы для сравнения суммы делителей) sum (для хранения максимального суммы делителей) и sum_temp (для подсчета суммы делителей текущего элемента), i_sum (для хранения индекса элемента с максимальной суммой делителей). При проходе массива действуем так. Берем очередной элемент массива A[i]. Затем запускаем подпрограмму подсчета суммы делителей (можно ее оформить и отдельной функцией по желанию). Она выглядит так: for(j=2; j<A[i]/2; j++) - т.е. мы перебираем все числа в диапазоне от 2 до A[i]/2, Проверяем каждое число на делимость без остатка, если делится, то sum_temp увеличиваем на это число, само число A[i] делим тоже на этот делитель. Вообще-то A[i] изменять нельзя (оно нам еще пригодится в конце, для вывода на экран), поэтому перед проверкой на делимость, нужно завести еще одну переменную temp=A[i];, а потом уже проверять temp. Итак temp тоже делим на этот делитель. Затем прверяем снова делимость без остатка уменьшенного temp на этот же делитель, и т.д. пока будет деоится без остатка. Затем берем следующий делитель. Продолжаем вычисление делителей пока temp>1. Затем сравниваем полученное sum_temp с sum. Если sum_temp>sum, то sum_temp=sum и i_sum=i. Вроде основная часть все.
Если честно, то проще код было написать, чем алгоритм. Надеюсь, что описал все понятно. Если что не поняли, спрашивайте.
1
outoftime
║XLR8║
764 / 663 / 212
Регистрация: 25.07.2009
Сообщений: 3,320
Записей в блоге: 5
29.11.2009, 08:45 3
Цитата Сообщение от Darky Посмотреть сообщение
2.
Дан целочисленный массив А[N]. Найти элемент массива с максималь-ной суммой делителей. Вывести на экран значение найденного элемента и его порядковый номер в массиве.
я б использовал доп масив, в который пихал бы количество делителей, для нахождения это количества есть функция GCD (перевод НОД на аглицкий) пишется она
так
C++
1
int gcd(int a, int b){ return (a) ? (gcd(b%a,a)) : (b);}
, выдает НОД пары чисел, все что остается пройтись циклом до корня и подсчитать количества таких пар. Да, и нужно учитывать, что НОД должен быть строго больше 1.

Если нужно за один проход, тогда сначала максимальная сума общих делителей с самого начала = -1, а потом при подсчете для каждого элемента смотрим что больше условным тернальным оператором или встроеной функцией max(), хотя 1-е - предпочтительней..

Просьба к автору уточнить условие по поводу 2-ой задачи: искать числа, на которые будет делится элемент масива нужно из самого масива, или среди его делителей?
0
Darky
Быдлокодер
508 / 295 / 84
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.11.2009, 10:26  [ТС] 4
outoftime, Лично я так понял задание, что искать числа нужно впринципе среди его делителей.

valeriikozlov, Спасибо, я сейчас потыкаюсь, если что будет непонятно, напишу.

Добавлено через 17 минут
Вот например первое задание.
Не мог додуматься как вычислить минимальный элемент массива, а гуглить такую слабую вещь - мозги разжижать.
Вот до чего додумался:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#define n 14
void main()
{
int min=32767,A[n],kol=0,i;
  for (i=1; i<n-1; i++)
    {
      cin>>A[i];
        if (min>A[i])
            min=A[i];
          if (A[i-1]>A[i] && A[i]<A[i+1] && A[i]>min)
            {
              kol++;
              cout<<"Index elementa: "<<i<<endl;
            }
    }
    cout<<"Kol-vo ravno: "<<kol;
}
Работает все правильно, но алгоритм подсчета минимального элемента мне кажется несколько неуместным.
(К слову, 32767 - потолок для signed int)

Добавлено через 18 минут
А со вторым совладать не могу.. Покажите код, пожалуйста - я разберусь.
0
valeriikozlov
Эксперт С++
4687 / 2513 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
29.11.2009, 10:38 5
Darky, Первое задание провалено (ничего страшного, мы найдем все равно золотую середину). Я же писал, что за два прохода. А Вы решили за один. Смотрите, вы в единственном проходе ищете минимум (я бы начальное значение min присвоил бы не32767, а значение нулевого элемента массива).
За один проход получается так: где-то в середине у Вас минимум такой-то, проверяемый элемент с боков окружен большими элементами, сам этот элемент меньше минимума, поэтому Вы этот элемент пропускаете. Но минимум может ведь уменьшится дальше, мы же об этом не знаем, и вполне возможно прпущенный элемент зря пропущен. Вот поэтому, первый проход просто поиск минимума (i=0; i<N; i++), а второй проход это как раз вычисление нужных нам элементов.
Со второй задачей сейчас помогу
0
outoftime
║XLR8║
764 / 663 / 212
Регистрация: 25.07.2009
Сообщений: 3,320
Записей в блоге: 5
29.11.2009, 10:51 6
C++
1
int min = -(1<<31-1)-1;
это абсолютный минимум для инта
0
Darky
Быдлокодер
508 / 295 / 84
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.11.2009, 10:54  [ТС] 7
valeriikozlov, Вот такая программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#define n 14
void main()
{
int min,A[n],kol=0,i,j;
 for (j=0; j<n; j++)
 {
      cin>>A[j];
      min=A[0];
        if (min>A[j])
            min=A[j];
    for (i=1; i<n-1; i++)
    {
          if (A[j-1]>A[j] && A[j]<A[j+1] && A[j]>min)
            {
              kol++;
              cout<<"Index elementa: "<<j<<endl;
            }
    }
  }
    cout<<"Kol-vo ravno: "<<kol;
}
Вроде бы подходит, но индекс элемента выдает много-много раз. Почему? Где ошибка?
0
valeriikozlov
Эксперт С++
4687 / 2513 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
29.11.2009, 11:02 8
2-ая:
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
#include <iostream>
#define n 14
int main()
{
int A[n],i, j, sum=0, sum_temp, i_sum, temp;
  for (i=0; i<n; i++)
    cin>>A[i];
  for(i=0; i<n; i++)
  {
      sum_temp=0;
      temp=A[i];
      for(j=2; j<=temp && temp>1; j++)
          if(temp%j==0)
          {
              temp/=j;
              sum_temp+=j;
              j--;
          }
        if(sum<sum_temp)
        {
            sum=sum_temp;
            i_sum=i;
        }
    }
    cout<<"Element s max summoi delitelei: "<<A[i_sum]<<endl;
    cout<<"Ego porydkovy nomer: "<<i_sum<<endl;
    return 0;
}
Добавлено через 6 минут
1-ая:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#define n 14
void main()
{
int min,A[n],kol=0,j;
cin>>A[0];
min=A[0];
 for (j=1; j<n; j++)
 {
      cin>>A[j];
      if (min>A[j])
            min=A[j];
 }
  for (j=1; j<n-1; j++)
    {
          if (A[j-1]>A[j] && A[j]<A[j+1] && A[j]>min)
            {
              kol++;
              cout<<"Index elementa: "<<j<<endl;
            }
    }  
    cout<<"Kol-vo ravno: "<<kol<<endl;
}
1
Darky
Быдлокодер
508 / 295 / 84
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.11.2009, 11:09  [ТС] 9
valeriikozlov, Спасибо! Сейчас буду копать, где ошибся в первой задаче - уже понял.
0
Darky
22.12.2010, 11:34  [ТС]     Два задания по одномерным массивам.
  #10

Не по теме:

и это писал я? боже, за год столько поменялось

0
22.12.2010, 11:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 11:34
Привет! Вот еще темы с ответами:

лаба по одномерным и многомерным массивам
Нужно сделать вот такую лабораторную, буду рад любой написанной функции,...

Этап в задаче по одномерным массивам
void zeroElementsDelete(int *array, size_t *arraySize) { size_t...

решите программы по одномерным массивам на языке С++
1.Массив заполнить с помощью генератора случайных чисел в интервале в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru