#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();
}
Все ли члены одной последовательности входят в другую последовательность (Си)
Верно ли, что все члены последовательности a1,..., a25 входят в последовательность b1,..., bn?
Вот моё решение:
Код:
Но я не знаю как организовать проверку: повторяются одни и те же числа в одной последовательности или нет. К примеру в Паскале я это делал с помощью метки, а как это можно сделать в си?
Цитата:
Но я не знаю как организовать проверку: повторяются одни и те же числа в одной последовательности или нет
Непонятно зачем это Вам нужно, т.к. по условию
Цитата:
Среди 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"*/;
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"*/;
Код:
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
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] модератор.
А идея насчет предварительного упорядочивания и далбнейшего поиска на определенном участке очень интересна, надо будет это запомнить. Спасибо.
to WidowMaker ну вроде бы до начала учгода не 1,5 месяца, а чуть больше половины.А делаю я это для того что мне в сентябре надо сдавать эти задачи и отчет о летней практики по си.
Цитата: Draconit
...
to WidowMaker ну вроде бы до начала учгода не 1,5 месяца, а чуть больше половины.А делаю я это для того что мне в сентябре надо сдавать эти задачи и отчет о летней практики по си.
to WidowMaker ну вроде бы до начала учгода не 1,5 месяца, а чуть больше половины.А делаю я это для того что мне в сентябре надо сдавать эти задачи и отчет о летней практики по си.
Draconit,ты не обязан обьяснять причину по которой ты задал вопрос.Задал - значит надо было.Все.И на флуд отвечать не стоит.
P.S. Если у кого то есть к Draconit вопросы личного характера - то для этого нужно использовать личные сообщения.