Подтвердить эквивалентность массивов после перестановки элементов - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д