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