Разность двух множеств A\B - C#
Формулировка задачи:
Здравствуйте! Нужно выполнить операцию A\B, т.е. разность множеств по такому алгоритму:
1. Положить i = j = 1 и k = 0.
2. Если в A и B (одновременно) ещё есть непросмотренные элементы, выполнить:
a. Если A[i] = B[j], то переходим к следующим элементам множеств A и B, так как равные элементы вычлись и в D ничего добавлять не надо. Выполняем i := i + 1 и j := j + 1
b. Если A[i] < B[j], то, в силу упорядоченности, в множестве B уже точно нет элемента, равного A[i], поэтому ничто не вычитается. Добавляем A[i] в D, то есть k := k + 1 и D[k] := A[i], и переходим к следующему элементу в A, то есть i := i + 1
c. Если A[i] > B[j], то берём следующий элемент из B (так как из A исключить элемент B[i] ввиду того, что в A нет такого элемента), то есть j := j + 1
d. Переходим к пункту 2.
Сам алгоритм разности
полностью код
Что не так с алгоритмом? То не все элементы вычитаются,то вообще выдает ошибку
int a = 0; int b = 0; int c = 0; int[] D = new int[(hashsetA.Count) + (hashsetB.Count)]; while (a < hashsetA.Count && b < hashsetB.Count) { if (A[a] == B[b]) { a++; b++; } else if (B[b] < A[a]) { c++; D[c] = A[a]; a++; } else if (B[b] > A[a]) { b++; } } while (a < hashsetA.Count && b > hashsetB.Count) { c++; D[c] = A[a]; a++; } Console.WriteLine(); Console.Write(D[c] + " "); Console.ReadLine(); } }
class Program { static void Main(string[] args) { Console.WriteLine("введите размерность А "); int LengthA = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Вводите элементы множества А"); int[] A = new int[LengthA]; for (int i = 0; i < LengthA; i++) { A[i] = Convert.ToInt32(Console.ReadLine()); } Console.WriteLine("Исходное множество"); for (int i = 0; i < LengthA; i++) { Console.Write(A[i] + " "); } Console.WriteLine(); Console.WriteLine("Повторяющиеся элементы удалены"); var hashsetA = new HashSet<int>(); foreach (var x in A) if (!hashsetA.Contains(x)) hashsetA.Add(x); Array.Resize(ref A, hashsetA.Count); A = hashsetA.ToArray(); foreach (var x in A) Console.Write("{0} ", x); for (int i = 0; i < A.Length; i++) { for (int j = 0; j < A.Length - 1; j++) { if (A[j] > A[j + 1]) { int z = A[j]; A[j] = A[j + 1]; A[j + 1] = z; } } } Console.WriteLine(); Console.WriteLine("Элементы отсортированы по возрастанию"); for (int i = 0; i < hashsetA.Count; i++) { Console.Write(A[i] + " "); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("введите размерность B "); int LengthB = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Вводите элементы множества B"); int[] B = new int[LengthB]; for (int i = 0; i < LengthB; i++) { B[i] = Convert.ToInt32(Console.ReadLine()); } Console.WriteLine("Исходное множество"); for (int i = 0; i < LengthB; i++) { Console.Write(B[i] + " "); } Console.WriteLine(); Console.WriteLine("Повторяющиеся элементы удалены"); var hashsetB = new HashSet<int>(); foreach (var x in B) if (!hashsetB.Contains(x)) hashsetB.Add(x); Array.Resize(ref B, hashsetB.Count); B = hashsetB.ToArray(); foreach (var x in B) Console.Write("{0} ", x); for (int i = 0; i < B.Length; i++) { for (int j = 0; j < B.Length - 1; j++) { if (B[j] > B[j + 1]) { int z = B[j]; B[j] = B[j + 1]; B[j + 1] = z; } } } Console.WriteLine(); Console.WriteLine("Элементы отсортированы по возрастанию"); for (int i = 0; i < hashsetB.Count; i++) { Console.Write(B[i] + " "); } // алгоритм разности int a = 0; int b = 0; int c = 0; int[] D = new int[(hashsetA.Count) + (hashsetB.Count)]; while (a < hashsetA.Count && b < hashsetB.Count) { if (A[a] == B[b]) { a++; b++; } else if (B[b] < A[a]) { c++; D[c] = A[a]; a++; } else if (B[b] > A[a]) { b++; } } while (a < hashsetA.Count && b > hashsetB.Count) { c++; D[c] = A[a]; a++; } Console.WriteLine(); Console.Write(D[c] + " "); Console.ReadLine(); } }
Решение задачи: «Разность двух множеств A\B»
textual
Листинг программы
if (A[a] == B[b]) { a++; b++; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д