Подтвердить эквивалентность массивов после перестановки элементов - C (СИ)
Формулировка задачи:
Добрый день. Нужно составить программу, определяющую, можно ли получить один массив перестановкой элементов другого массива.
Програмка должна считывать из стандартного потока ввода элементы обоих массивов, а затем выводить в стандартный поток вывода слово "yes", если массивы совпадают с точностью до перестановки элементов, и "no" – в противном случае.
Сортировать массивы запрещается.
Для цифр "1 2 3 4 5 6 7 8" и "8 7 6 5 4 3 2 1" выводится значение "yes". Но проблема в том, что для "1 1 2 2 3 3 4 4" и "1 2 3 4 1 2 3 4" выводится значение "no", но должно вывести "yes".
мой код:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a[8];
int b[8];
int i;
int k = 0;
for (i = 0; i < 8; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < 8; i++)
{
scanf("%d", &b[i]);
}
for (i = 0; i < 8; i++)
{
if (a[i] == b[7 - i]) k++;
}
if (k == 8) printf("yes");
else printf("no");
return 0;
}
По этой программе:
1)Ввод
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
Вывод yes
2)Ввод
1 1 2 2 3 3 4 4
1 2 3 4 1 2 3 4
Вывод yes
3)Ввод
1 1 1 1 1 2 2 2
2 2 2 2 1 1 1 1
Вывод no
----------------------------------------------
У меня ко второму случаю не получается( помогите, пожалуйста.
Решение задачи: «Подтвердить эквивалентность массивов после перестановки элементов»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int check(int a[], int b[], unsigned size) {
bool use[size];
unsigned i, j;
memset(use, 0, sizeof(use));
for (i = 0; i < size; ++i) {
for (j = 0; j < size; ++j) {
if (!use[j] && (a[i] == b[j])) {
use[j] = true;
break;
}
}
if (j == size) {
return 0;
}
}
return 1;
}
int main() {
int a[8], b[8], i;
for (i = 0; i < 8; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < 8; ++i) {
scanf("%d", &b[i]);
}
printf("%s\n", check(a, b, 8) ? "yes" : "no");
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с массивами, строками и булевыми значениями
- Определяем функцию check, которая принимает три аргумента: массив a, массив b и размер массива
- Создаем внутри функции массив use типа bool с размерностью size для отслеживания использованных элементов
- Инициализируем все элементы массива use значением false с помощью функции memset
- Проходим по всем элементам массива a в функции main и запрашиваем у пользователя ввод соответствующих значений
- Проходим по всем элементам массива a и b в функции check и сравниваем их значения
- Если элемент массива b не использован и равен элементу массива a, то устанавливаем значение true для соответствующего элемента массива use и прерываем внутренний цикл с помощью оператора break
- Если после прохода по всем элементам массива b не было найдено соответствующих элементов, то возвращаем 0, что означает, что массивы не эквивалентны
- Если же были найдены соответствующие элементы, то возвращаем 1, что означает, что массивы эквивалентны
- Выводим на экран результат проверки с помощью функции printf