Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Все ли члены одной последовательности входят в другую последовательность (Си)

16K
11 августа 2007 года
Draconit
39 / / 10.08.2007
Задача: Даны натуральное число n, целые числа a1,..., a25, b1,..., bn. Среди a1,..., a25 нет повторяющихся чисел, нет их и среди b1,..., bn.
Верно ли, что все члены последовательности a1,..., a25 входят в последовательность b1,..., bn?

Вот моё решение:
Код:
#include <stdio.h>;
#include <conio.h>;
#include <math.h>;
int n,i,j,k,a[25],b[50];
void main()
{
clrscr();
k=0;
puts("Введите n");
scanf("%i",&n);
for (i=0; i<25; i++)
 {
  printf("%i - элемент последовательности a=",i+1);
  scanf("%i",&a);
  }
for (i=0; i<n; i++)
 {
 printf("%i - элемент последовательности b=", i+1);
 scanf("%i",&b);
 }
for (i=0; i<25; i++)
 {
  for (j=0; j<n; j++)
  {
   if (a==b[j]) k=k+1;
  }
 }
if (k==25) puts("Да");
else puts("Нет");
getch();
}


Но я не знаю как организовать проверку: повторяются одни и те же числа в одной последовательности или нет. К примеру в Паскале я это делал с помощью метки, а как это можно сделать в си?
28K
11 августа 2007 года
Vladimir.
12 / / 03.08.2007
Цитата:
Но я не знаю как организовать проверку: повторяются одни и те же числа в одной последовательности или нет


Непонятно зачем это Вам нужно, т.к. по условию

Цитата:
Среди a1,..., a25 нет повторяющихся чисел, нет их и среди b1,..., bn.

.
Обратите внимание, что Вы сравниваете каждое а с каждым b. Если предварительно упорядочить a1,..., a25 и b1,..., bn, проверка принадлежности a к b сведется к поиску на определенном участке.
например в случае упорядочивания по возрастанию:

Код:
/* поиск левой границы промежутка */
int left = -1;
for (j=0;j<n-25;j++)
{
   if (sorted_b[j]==sorted_a[0]) {left=j; break;}
}

if (left == -1) /*Выход с ответом "a не принадлежит b"*/;

/* Поиск правой границы промкжутка */
int right = -1;

for (j=left+25;j<=n;j++)
{
   if (sorted_b[j]==sorted_a[24]) {right=j; break;}
}
if (right == -1) /*Выход с ответом "a не принадлежит b"*/;

if ((right-left)<25) /*Выход с ответом "a не принадлежит b"*/;


/* собственно проверка */

j=left;

for (int i=0; i<25;) //i=0...24;
{
     (sorted_b[j]==sorted_a)?(i++):(j++);
     if (j>right) /*Выход с ответом "a не принадлежит b"*/;
}
//проверка завершена.
/*Выход с ответом "a принадлежит b"*/;
2.0K
11 августа 2007 года
WidowMaker
212 / / 05.04.2005
Пусть у тебя есть два массива и B:
 
Код:
1. Сортируешь каждый из них.;i=0;j=0;
2. Если i<numA берешь A
3. если j<numB cравниваешь его с B[j]:
    if A==B[j], то i++,j++ и к п2;
    else if А<B[j], то либо массив А содержит повторения,
    либо B не содержит все элементы А;
    else j++ и к п3

Как проверять элементы В на повторения пока сказать не могу, можешь просто выполнять проверку на отсортированном массиве (вида b!=b[i-1]), либо если ты будешь сортировать через qsort, то делаешь проверку в своей cmp_func.

упс опоздал:D

ЗЫ: это конечное не мое дело, но ты что к олимпиаде готовишься? до начала учгода еще 1,5 месяца;)
[COLOR="Red"]Каким образом тебя касается к чему он готовится ? Получаешь -15 баллов за флуд.[/COLOR] модератор.
16K
11 августа 2007 года
Draconit
39 / / 10.08.2007
to Vladimir. проверку я хочу сделать во-первых: для себя - чтоб разобраться, а во-вторых: то что нет повторяющихся сказано только в условии, но это не значит что при вводе чисел, я не введу одинаковые и в этом случае, программа должна мне сообщить об этом, ну и в-третьих: вдруг когда я буду сдавать это преподователю он спросит: "А где проверка?" :)

А идея насчет предварительного упорядочивания и далбнейшего поиска на определенном участке очень интересна, надо будет это запомнить. Спасибо.

to WidowMaker ну вроде бы до начала учгода не 1,5 месяца, а чуть больше половины.А делаю я это для того что мне в сентябре надо сдавать эти задачи и отчет о летней практики по си.
320
11 августа 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: Draconit
...
to WidowMaker ну вроде бы до начала учгода не 1,5 месяца, а чуть больше половины.А делаю я это для того что мне в сентябре надо сдавать эти задачи и отчет о летней практики по си.


Draconit,ты не обязан обьяснять причину по которой ты задал вопрос.Задал - значит надо было.Все.И на флуд отвечать не стоит.
P.S. Если у кого то есть к Draconit вопросы личного характера - то для этого нужно использовать личные сообщения.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог