Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: как найти количество совпадающих значений элементов массива А и В  (Прочитано 55158 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #30 : 02-01-2009 18:46 » 

посидел подумал...листик почёркал много раз...но вроде доехало по ходу так...
Код:
for(i=0; i<n; i++)
j=0;
if(A[i]==A[i++]) k++; //вот кол одинаковых х в массиве А
if(B[j]==B[j++]) m++; //вот кол этого х в массиве В
if(A[i]=B[j]) t=m*k;
Да-да?
Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 02-01-2009 18:59 » 

Нет Улыбаюсь
Во-первых, в приведённом коде цикл будет лишь присваивать j значение 0, остальной код выполнится 1 раз

Во-вторых, код
Код:
A[i]==A[i++]
сравнит A[i] с A[i] и лишь потом увеличит значение счётчика, а потом счётчик ещё раз будет увеличен при входе на новую итерацию цикла - то есть, каждый 2й элемент и вовсе будет пропущен.

Ну а в-третьих, даже если поправить, получится не совсем тот результат. Потестируй, потрассируй этот код по шагам Ага
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #32 : 03-01-2009 01:57 » 

может так ??
Код:
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i]==A[i--]) k++; //сравнивает i-1 элемент массива А с i
if(A[i]==B[j--]) m++; //
if(B[j]==B[j--]) m++; //

t=m*k;
...
как в В массиве предусмотреть совподение чисел как и  в А...?  Здесь была моя ладья... и ещё ..можно ли это сделать без дополнительных переменных m  и к...тока с t допустим...
да...казалось куда проще..
« Последнее редактирование: 03-01-2009 02:14 от ЮрийFM » Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 03-01-2009 10:28 » 

я вот тут накидал решение на Haskell - разумеется, оно в функциональном стиле, но принцип, думаю, неплохо иллюстрирует Улыбаюсь
Код: (Text)
count_pairs :: [Int]->[Int]->Int
count_pairs [] _ = 0
count_pairs as@(a:_) bs = (move_a as bs a 0) where

        move_a :: [Int]->[Int]->Int->Int->Int
        move_a [] bs x m = move_b [] bs x m 0
        move_a s@(a:as) bs x m  | a == x = move_a as bs x (m+1)
                                | a > x = move_b s bs x m 0

        move_b :: [Int]->[Int]->Int->Int->Int->Int
        move_b _ [] _ m n = m*n
        move_b as s@(b:bs) x m n | b == x = move_b as bs x m (n+1)
                                 | b < x = move_b as bs x m n
                                 | b > x = (m * n) + count_pairs as s
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #34 : 03-01-2009 14:15 » 

Haskell...если бы я его знал было бы  Класс!....но
код вроде не сложный да и есть сходство ...можно и разобраться если постараться ... Улыбаюсь

А если так???
просто можно код прописать через goto...т.е. ссылаться на цикл пока допустим не найдёт все х одинаковые...потом идёт на массив В ищёт там х ...если его нет то на start
« Последнее редактирование: 03-01-2009 15:06 от ЮрийFM » Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 03-01-2009 16:01 » new

ЮрийFM, ну не писать же мне для тебя полное решение на C++ - это было бы не спортивно Улыбаюсь В сущности, моё решение - это подобие 2 циклов, но не таких, какими их организовывал ты. То есть, не "от первого до последнего", а несколько похитрее Улыбаюсь
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #36 : 03-01-2009 17:37 » 

 :)да..да...надобно самому.. Да-да
Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #37 : 04-01-2009 02:55 » 

 Улыбаюсь ну...вроде всю хитрость использовал...на какой-то код убиваю уже какой день...туплю...
да сёровно и проверяю код по строкам и вроде правильно кидаю его в прогу ..нифига...вот последнее что пробовал...голова уже не варит С ума сойти...
Код:
    for(i=0; i<n; i++)
x=A[i];
if(x==A[i--]) k++;
for(j=0; j<n; j++)
x=B[j];
if(x==B[j--]) m++;
Записан

Учиться сложно...но интересно
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #38 : 04-01-2009 10:46 » 

x==A[i--] убиться веником. при анализе условия изменяем индекс цикла? нафига?

A=1112345
B=1145

1. два первых элемента совпали: общее число совпадений +1, число совпадений с текущего элемента A с B +1
2. подвинули  ++b
3. A[0] и B[1] совпали: общее число совпадений +1, число совпадений с текущего элемента A с B +1
4. подвинули  ++b
5. A[0] и B[2] не совпали: ++a
6. A[0] == A[1]: к общему число совпадений прибавляем число совпадений с предыдущего элемента A
7. подвинули  ++a
8. A[1] == A[2]: к общему число совпадений прибавляем число совпадений с предыдущего элемента A
9. подвинули  ++a
10. A[2] != A[3]: совпадений предыдущего элемента A обнуляем
11. выравниваем индексы до совпадения после чего продолжаем с пункта 1

и забудь про вложенные циклы
Записан

Странно всё это....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #39 : 04-01-2009 11:12 » 

LogRus, вложенный цикл возможен, но можно и без него.

ЮрийFM, твоя проблема начинается вот с этого:
Код:
for(i=0; i<n; i++)
циклы можно организовывать не только так. Если рассматривать только for, то можно, например, так:
Код:
for ( i = 0 ; i < n; )
{
    if (expression) // если нужно увеличить счётчик, мы это делаем. иначе - нет.
        ++i;
}
тогда цикл будет выполнять не n итераций, а столько, сколько потребуется для достижения нужного результата. Например, пока не пройдёт оба массива до конца. Хотя уж проще выразить то же самое оператором while - он для того и существует.
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #40 : 04-01-2009 14:43 » 

 Да-да понял) Спасиб
Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #41 : 04-01-2009 15:59 » 

 вот что -то похожее
Код:
  
for(i=0; i<n;)
for(j=0; j<n;)
{
if(A[i]==B[j]) t++;
j++;
if(A[i]==B[j]) t++;
j++;
if(A[i]!=B[j]) i++;
if(A[i]==A[i++]) t++;
i++;
if(A[i]==A[i++]) t++;
i++;
if(A[i]!=A[i++]) t--;
if(i<j) j--;
i--;
}
« Последнее редактирование: 04-01-2009 16:18 от ЮрийFM » Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 04-01-2009 16:18 » 

Зациклится ведь Улыбаюсь Потому как в цикле будет исполняться только это:
Код:
for(i=0; i<n;)
for(j=0; j<n;)
if(A[i]==B[j]) t++;
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #43 : 04-01-2009 16:20 » 

.да..да...поэтому я и выложил код ...не знал где циклит) Улыбаюсь попробую поправить..хотя тут видно что будет циклить ведь элементы массива не меняются
« Последнее редактирование: 04-01-2009 16:22 от ЮрийFM » Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #44 : 04-01-2009 16:42 » 

Код:
for(i=0; i<n;)
for(j=0; j<n;)
if(A[i]==B[j]) t++;
но почему...?? 
Код:
if(A[i]==B[j]) t++;
если это не выполняется то должно идти дальше...и если да то T++ и тоже вниз
Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 04-01-2009 18:50 » 

Я это написал до того, как ты пофиксил, добавив скобки. Теперь если и виснет, то по другой причине Улыбаюсь 

Пара советов:
Форматируй код, чтобы для себя было ясно, что в какой последовательности выполняется.  И комментируй, чтобы было более ясно, что пытается сделать код Улыбаюсь

Не очень понятно, как с помощью увеличения t исключительно оператором ++ ты хочешь учесть m*n пар в двух массивах Улыбаюсь
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #46 : 04-01-2009 22:19 » 

Код:
{
i=0;
while (i<n)
{
if(A[i]==B[j]) m++;
j++;
if(A[i]==B[j]) m++;
j++;
if(A[i]!=B[j]) i++;
if(A[i]==A[i++]) k++;
i++;
if(A[i]==A[i++]) k++;
i++;
if(A[i]!=A[i++]) k--;
if(i<j) j--;
i--;
}
t=m*k;
}
хотя через while для этого случая удобнее
Код:
for(j=0;j<n;)
for(i=0; i<n;))
в этом случае вообще выдаёт отрицательный результат ...это наверно из-за того что тип для которого я исползую переменную не входит в рамки результата..да?
« Последнее редактирование: 04-01-2009 22:23 от ЮрийFM » Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #47 : 04-01-2009 22:28 » 

ЮрийFM, твой код в любом случае делает нечто странное Улыбаюсь Я же указал принцип в своём коде - там не обязательно знать язык, хотя бы просто отследить, в каком порядке и что делается, и спокойно расставить всё по полочкам. Действий всего два: движение по A и движение по B.
Пока я вижу попытку угадать результат - ведь этот код работает совсем не так, как надо, да? Улыбаюсь
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #48 : 04-01-2009 22:40 » 

да верно...вот пробую

Код:

{
for(i=0; i<n;) //пока i<n выполнять
for(j=0; j<n;) //пока j<n выполнять
{
if(A[i]==B[j]) m++;  //если А0 равно В0 то прибавляем к M единицу (m++)
j++;                  //увеличиваем j то есть берем В1
if(A[i]==B[j]) m++;   //уже если А0 равно В1 то прибавляем к M единицу (m++)
j++;                    //увеличиваем j то есть берем В2
if(A[i]!=B[j]) i++;      ////уже если А0 неравно В3 то увеличиваем счётчик  i берем А1
if(A[i]==A[i++]) k++;     // если А1 равно А2 то увеличиваем k на единицу
i++;                      //увеличиваем i то есть берем A2
if(A[i]==A[i++]) k++;   // если А2 равно А3  то увеличиваем k на единицу
i++;                   //увеличиваем i то есть берем A3
if(A[i]!=A[i--]) i--;  //есди А3 не равно А2 то уменьшаем i на единицу
if(i<j) j--;            //тут идёт уравнивание
i--;
}
t=m*k;
}
Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #49 : 04-01-2009 22:57 » 

Цитата
Код:
if(A[i]!=B[j]) i++;      ////уже если А0 неравно В3 то увеличиваем счётчик  i берем А1
А если A0 таки равно B3? Улыбаюсь
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #50 : 05-01-2009 01:30 » 

а если тако равно то нада прибавить к j 1(единицу) и опять сравнивать if(A==B[j]) m++;


так вот же!!!! у меня и с этим все проблемы я же не буду прописывать код в котором буду придавлять к житому элемнту единицу н раз...это не тактично...и причём не экономично) чтоли цикл там вставить while к примеру..но если даже цикл вставить то у меня циклит а чего..? всё перепробывал
 свой вариант писал...но опять же в это всё упирается...хотя можно обойти это каким-то боком но каким я не знаю
Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #51 : 05-01-2009 08:12 » 

Ну а даже если и цикл - то какой цикл? С каким условием?
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #52 : 05-01-2009 09:16 » 

ну тут всё просто если (A[i]==B[j]) то надо j++

for(;A[i]==B[j]; j++) так походу Не-а...?
« Последнее редактирование: 05-01-2009 09:20 от Sla » Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #53 : 05-01-2009 20:39 » 

ЮрийFM, m*n - получится количество всех возможных пар одинаковых чисел x из A и B. Вроде, в условии про это.

нет..нет..надо найти количесво совподающих элементов массива А и В...тут не  про пары..т.е. t=m+k
Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #54 : 05-01-2009 20:43 » 

я тупил чё то))... через x... вроде Вад имел это ввиду хитрого кода)
Код:
for (i = 0; i < n; i++)
 {
    x=A[i];

  for (j = 0; j < n; j++)
   {
    if (x==B[j])
{ m++; }
    if (i==j)
{ continue; }
    if (x==A[j])
{ k++; }
   }
   }
t=k+m;

это вот тот код который правильный...100% Да-да
« Последнее редактирование: 05-01-2009 20:45 от ЮрийFM » Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #55 : 05-01-2009 20:59 » 

Хм. а сложность у тебя всё равно квадратичная Улыбаюсь А если совпадающих чисел больше, чем одно (которое x)?
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #56 : 05-01-2009 21:05 » 

а если больше то пропустит Да-да...я просто не знаю как этот вставить как и в прошлом случае вставляю не пашет ...да и времени у меня в обрез...надо другую задачку лупить...мот что и придумаю Ага
Записан

Учиться сложно...но интересно
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #57 : 05-01-2009 21:17 » 

ЮрийFM, про сортировку слиянием слышал когда-нибудь? Улыбаюсь Там очень похожий случай на этапе слияния двух массивов, стандартная реализация как раз подразумевает слияние двух отсортированных массивов в один отсортированный за линейное время. По сути, разница между тем алгоритмом и твоим - только в том, что тебе нужно не копировать значения, а считать одинаковые. Более детальную подсказку придумать сложно Улыбаюсь

А последняя интерпретация условия мне кажется какой-то мутной: то есть, если в A и B есть одинаковые элементы, то сумма увеличивается на количество вхождений элемента в A и в B? Странно как-то, ну да ладно.
Записан
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #58 : 05-01-2009 21:42 » 

про слияние массивов...нет честно нет...я пробовал обычным способом...ибо я изучаю си не так давно и кидаюсь на всё что не знакомо... Ага слиянием эт сделать как 2 пальца...и проще...даже)
Записан

Учиться сложно...но интересно
ЮрийFM
Участник

by
Offline Offline
Пол: Мужской
Диплом 2 степени по Графике!


« Ответ #59 : 06-01-2009 13:29 » 

программка как раз и выполняет параллельную проверку в двух массивах, т.е. одновременно. Берет i-й элемент, приравнивает его к x, а потом x сравнивает одновременно с элементами A[j] и B[j], пока не достигнет конца массивов. Затем идет следующий цикл, Берется следующий i+1-элемент, и все проверяется заново...
но... Улыбаюсь а если за х идет элемнт равный х ...вот и сэкономим место и время...если это условие учесть )

Кстати, эта программа может работать и с неупорядоченным массивом
« Последнее редактирование: 06-01-2009 13:37 от ЮрийFM » Записан

Учиться сложно...но интересно
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines