Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.11.2009, 07:19     Два задания по одномерным массивам. #1
1.
Дан вещественный массив А[N]. Определить количество и индексы тех элементов массива, которые меньше элементов, стоящих в соседних позициях справа и слева, но больше минимального элемента массива.

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


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

C++ решите программы по одномерным массивам на языке С++
Задания по одномерным массивам. C++
C++ Вопрос по одномерным массивам.
задача по одномерным массивам C++
Задача по одномерным массивам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 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. Вроде основная часть все.
Если честно, то проще код было написать, чем алгоритм. Надеюсь, что описал все понятно. Если что не поняли, спрашивайте.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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-ой задачи: искать числа, на которые будет делится элемент масива нужно из самого масива, или среди его делителей?
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 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 минут
А со вторым совладать не могу.. Покажите код, пожалуйста - я разберусь.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
29.11.2009, 10:38     Два задания по одномерным массивам. #5
Darky, Первое задание провалено (ничего страшного, мы найдем все равно золотую середину). Я же писал, что за два прохода. А Вы решили за один. Смотрите, вы в единственном проходе ищете минимум (я бы начальное значение min присвоил бы не32767, а значение нулевого элемента массива).
За один проход получается так: где-то в середине у Вас минимум такой-то, проверяемый элемент с боков окружен большими элементами, сам этот элемент меньше минимума, поэтому Вы этот элемент пропускаете. Но минимум может ведь уменьшится дальше, мы же об этом не знаем, и вполне возможно прпущенный элемент зря пропущен. Вот поэтому, первый проход просто поиск минимума (i=0; i<N; i++), а второй проход это как раз вычисление нужных нам элементов.
Со второй задачей сейчас помогу
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
29.11.2009, 10:51     Два задания по одномерным массивам. #6
C++
1
int min = -(1<<31-1)-1;
это абсолютный минимум для инта
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 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;
}
Вроде бы подходит, но индекс элемента выдает много-много раз. Почему? Где ошибка?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 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;
}
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.11.2009, 11:09  [ТС]     Два задания по одномерным массивам. #9
valeriikozlov, Спасибо! Сейчас буду копать, где ошибся в первой задаче - уже понял.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 11:34     Два задания по одномерным массивам.
Еще ссылки по теме:

Задача по одномерным массивам C++
C++ Этап в задаче по одномерным массивам
лаба по одномерным и многомерным массивам C++

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

Или воспользуйтесь поиском по форуму:
Darky
22.12.2010, 11:34  [ТС]     Два задания по одномерным массивам.
  #10

Не по теме:

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

Yandex
Объявления
22.12.2010, 11:34     Два задания по одномерным массивам.
Ответ Создать тему
Опции темы

Текущее время: 08:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru