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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2008, 23:22   #1
milton
 
Регистрация: 28.09.2008
Сообщений: 8
По умолчанию Определить, сколько чисел входит ровно дважды в последовательность а1,а2,...,аm

Задача звучит так: "Определить, сколько чисел входит ровно дважды в последовательность а1,а2,...,аm и входит ровно трижды в b1,b2,...,bn". M и n заданы, не в них проблема. Я сумел выполнить задачу только по отдельности для каждого массива, не знаю, как правильно задать проверку на равенство чисел, удовлетворяющих условиям. Помогите, пожалуйста.
milton вне форума Ответить с цитированием
Старый 09.11.2008, 02:40   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
const
  n = 5; m = 10;
var
  mas1, tmp1: array[1..n] of byte;
  mas2, tmp2: array[1..m] of byte;
  i, j, k, a, b: byte;
  t: boolean;
begin
  writeln('mas1');
  for i := 1 to n do readln(mas1[i]);
  writeln('mas2');
  for i := 1 to m do readln(mas2[i]);

  //для первой последовательности
  for i := 1 to n do
  begin
    k := 1;
    for j := 1 to n do
    if (mas1[i] = mas1[j]) and (i <> j) then inc(k);//ищем совпадения
    if k = 2 then
    begin
      t := true;
      for j := 1 to a do if mas1[i] = tmp1[j] then
      //чтоб одно и то же число несколько раз не учитывать
      begin
        t := false;
        break;
      end;
      if not t then continue;
      inc(a); //количестно найденных повторов
      tmp1[a] := mas1[i] //запоминаем число встречающееся к=2 раз
    end;
  end;

  //аналогично для второй последовательности
  for i := 1 to m do
  begin
    k := 1;
    for j := 1 to m do
    if (mas2[i] = mas2[j]) and (i <> j) then inc(k);
    if k = 3 then
    begin
      t := true;
      for j := 1 to a do if mas2[i] = tmp2[j] then
      begin
        t := false;
        break;
      end;
      if not t then continue;
      inc(b);
      tmp2[b] := mas2[i]
    end;
  end;

  writeln('result');
  for i := 1 to a do
  for j := 1 to b do
  if tmp1[i] = tmp2[j] then write(tmp1[i]:2);
  readln
end.
eoln вне форума Ответить с цитированием
Старый 09.11.2008, 15:38   #3
milton
 
Регистрация: 28.09.2008
Сообщений: 8
По умолчанию

Огромное человеческое спасибо!
milton вне форума Ответить с цитированием
Старый 11.11.2008, 17:56   #4
milton
 
Регистрация: 28.09.2008
Сообщений: 8
По умолчанию

А такой вопрос, ведь изначально все переменные предполагаемо равны нулю, тогда как выполняется команда for j := 1 to a do if mas1[i] = tmp1[j] then если а=0 изначально? а увеличение а лишь в цикле, войти в который можно только через эту строку...
milton вне форума Ответить с цитированием
Старый 11.11.2008, 18:31   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

for j := 1 to a do if mas1[i] = tmp1[j] находится внутри цикла
Код:
  //для первой последовательности
  for i := 1 to n do
  begin
    k := 1;
    ...
и повторяется N раз, при выполнении определённых условий переменная А увеличивается. В первый раз цикл for j := 1 to a do if mas1[i] = tmp1[j] ... не выполнится ниразу.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить, сколько учеников класса не имеют отметок ниже четырех HOOKER Помощь студентам 6 08.10.2008 19:50
Последовательность чисел с степенью до N SEREG@ Помощь студентам 4 15.06.2008 22:41
Среди 20 введёных чисел определить чётные, распечатать их, определить min Spade Помощь студентам 4 15.06.2008 18:39
Из двух натуральных чисел, составить наибольшее число, сохраняя первоначальную последовательность.Паскаль Omedus Помощь студентам 8 19.11.2007 22:02