Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 16:54   #1
voodooism
 
Регистрация: 23.01.2013
Сообщений: 6
По умолчанию Максимальное из чисел, встречающихся в заданной матрице более одного раза

Написал код для решения данной задачи:


Код:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
const int n=4, m=5, r=20;
int b[r], i, j, q, w, s=0, tmp;
int a[n][m]={                            //для удобства задаем массив сразу в коде программы
	{2, 3, 4, 5, 6},
	{0, 12, 3, 3, 3},
	{3, 2, 5, 5, 6},
	{6, 2, 3, 4, 5},
};
//Вывод исходного массива
cout << "Исходный массив:";
for (i=0; i<n; i++)
	{
			cout << endl;
		for (j=0; j<m; j++)
			cout << a[i][j] << "\t";
	}
cout << endl;	
for(i=0; i<n; i++)   //цикл который последовательно сравнивает каждый элемент матрицы со всеми остальными
    {
        for(j=0; j<m; j++)
        {
            for(q=0; q<n; q++)
            {
                for(w=0; w<m; w++)
                {
                    if(a[i][j]==a[q][w] && (i!=q || j!=w))            //во втором условии исключаем элементы с одинаковыми индексами
						{
							b[s]=a[i][j];        //записываем в массив b найденный элемент
							s++;
							q=n;                 //прекращаем искать одинаковые элементы, и переходим к следующему
							break;              //выходим из этого цикла
						}
                }
            }
        }
    }
for(i=0;i<s;i++)              //выводим получившийся массив чтобы полюбоваться своим творением
	cout<<b[i]<<"\t";
cout<<endl;
tmp=b[0];
for(i=0;i<s;i++)          //сравниваем  соседние числа в поисках наибольшего.
	{	
			if (b[i+1]>tmp)
			tmp=b[i+1];
	}
cout<<"Максимальное из чисел встречающееся более одного раза равно "<<tmp<<endl;
system("pause");
return 0;
}

В принципе, с задачей он справляется, максимальный элемент находит. Никаких условий мне больше не давалось.
Результат работы программы на прикрепленном изображении.
Но мне интересно, как исключить повторения элементов в новом массиве? Т.е. чтобы в моем конкретном случае в новом массиве были только элементы 2, 3, 4, 5, 6.
Изображения
Тип файла: jpg FC9pU8P.jpg (19.2 Кб, 286 просмотров)
voodooism вне форума Ответить с цитированием
Старый 23.01.2013, 17:04   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

for четырёхкратной вложенности? Мама...
Отсортировать множество элементов не пробовали?
Abstraction вне форума Ответить с цитированием
Старый 23.01.2013, 17:18   #3
voodooism
 
Регистрация: 23.01.2013
Сообщений: 6
По умолчанию

Изначально я рассматривал оба варианта (мой и ваш). Но уже написал этот. Вот теперь интересует, можно ли оптимизировать.
voodooism вне форума Ответить с цитированием
Старый 23.01.2013, 17:25   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Вот теперь интересует, можно ли оптимизировать.
Да, если b - не массив, а множество или упорядоченное множество. Эти примитивы как раз обладают тем свойством, что "добавление" в них уже имеющегося объекта не меняет их.
Простейший (и жутко неэффективный, отнюдь не являющийся "оптимизацией") способ - перед добавлением элемента в b проверять, нет ли его уже там.

Гм... в принципе, можно вот так, будет уже не столь страшно:
Код:
int b[r][2];
//...
for(int i=0; i<n; i++)   //Обходим элементы матрицы
    {
        for(int j=0; j<m; j++)
        {
            int k;
            for(k=0; k<s; ++k) //Для каждого элемента, идём по массиву b
            {
                if(b[k][0] == a[i][j]) //Если такой уже есть,...
                {
                    b[k][1]++; //Плюс-один
                    break;
                }
            }
            if(k == s) //если дошли до конца массива
            {
                b[k][0] = a[i][j];
                b[k][1] = 1;
                ++s;
            }
        }
    }
//...
for(int i=1;i<s;i++)          //сравниваем  соседние числа в поисках наибольшего.
	{	
	        if (b[i][0]>tmp && b[i][1]>1) //Эй, а откуда b[i+1]?! Мы же так за границу вылезем!
			tmp=b[i];
	}

Последний раз редактировалось Abstraction; 23.01.2013 в 17:34.
Abstraction вне форума Ответить с цитированием
Старый 23.01.2013, 17:28   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
можно ли оптимизировать.
Можно. Все должно решаться двумя циклами. А у Вас для нахождения максимального целых пять. Четыре вложенных и отдельный итоговый.
EUGY вне форума Ответить с цитированием
Старый 23.01.2013, 17:41   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
можно ли оптимизировать.
Abstraction ведь сказал, отсортировать.
Но можно и без сортировки, двумя циклами.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.01.2013, 17:50   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Но можно и без сортировки, двумя циклами.
То, что приходит мне в голову (мы же говорим об алгоритме без использования динамических структур данных?), вроде выходит O(N^2) в среднем, где N - количество элементов матрицы.
Abstraction вне форума Ответить с цитированием
Старый 23.01.2013, 17:59   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Да, как-то так. Я не отлаживал,но принцип понятен.
Код:
	const n = 4, m = 5;
	int mx = INT_MIN;
	bool has = false;

	int a[n][m]=	{
		2, 3, 4, 5, 6,
		0, 12, 3, 3, 3,
		3, 2, 5, 5, 6,
		6, 2, 3, 4, 5 };


		for (int i = 0; i < n * m; i++)
		{
			int tmp = *((int*) a + i) ;
			if (tmp > mx)
			{
				for (int z = i+1; z <  n * m; z++)
				{
					if (tmp == *((int*) a + z) ) 
					{
						mx = tmp;
						has = true;
						break;
					}
				}
			}
		}

		if (has)
			std::cout <<  mx << std::endl;
		else
			std::cout << "Repeated max element not found"  << std::endl;
EUGY вне форума Ответить с цитированием
Старый 23.01.2013, 19:14   #9
voodooism
 
Регистрация: 23.01.2013
Сообщений: 6
По умолчанию

Мне немного не понятен синтаксис
Код:
int tmp = *((int*) a + i);
tmp == *((int*) a + z)
Вместо этого можно написать ?
Код:
int tmp=a[i];
tmp==a[z];
или нет?
voodooism вне форума Ответить с цитированием
Старый 23.01.2013, 19:24   #10
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

где звёздочки это получение содержимого по адресу. понимаете?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны числа а1,..,а60. Организовать новый массив из тех чисел, которые входят в последовательность более одного раза (С) Мишаня@ Помощь студентам 0 01.12.2012 22:01
Максимальное из чисел встречающих в заданной матрице более одного раза Seo-optimist Общие вопросы C/C++ 11 25.10.2010 21:44
Максимальное из чисел встречающих в заданной матрице более одного раз Seo-optimist Помощь студентам 1 25.10.2010 15:13
Целочисленный массив. Элементы, которые встречаются более одного раза! Алина18 Помощь студентам 2 21.10.2010 08:10
поиск максимального элемента, который встречается более одного раза счастливая Помощь студентам 1 25.05.2010 16:41