Разность двух множеств 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. Сам алгоритм разности
Листинг программы
  1. int a = 0;
  2. int b = 0;
  3. int c = 0;
  4. int[] D = new int[(hashsetA.Count) + (hashsetB.Count)];
  5. while (a < hashsetA.Count && b < hashsetB.Count)
  6. {
  7. if (A[a] == B[b])
  8. {
  9. a++;
  10. b++;
  11. }
  12. else if (B[b] < A[a])
  13. {
  14. c++;
  15. D[c] = A[a];
  16. a++;
  17. }
  18. else if (B[b] > A[a])
  19. {
  20. b++;
  21. }
  22. }
  23. while (a < hashsetA.Count && b > hashsetB.Count)
  24. {
  25. c++;
  26. D[c] = A[a];
  27. a++;
  28. }
  29. Console.WriteLine();
  30. Console.Write(D[c] + " ");
  31. Console.ReadLine();
  32. }
  33. }
полностью код
Листинг программы
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Console.WriteLine("введите размерность А ");
  6. int LengthA = Convert.ToInt32(Console.ReadLine());
  7. Console.WriteLine("Вводите элементы множества А");
  8. int[] A = new int[LengthA];
  9. for (int i = 0; i < LengthA; i++)
  10. {
  11. A[i] = Convert.ToInt32(Console.ReadLine());
  12. }
  13. Console.WriteLine("Исходное множество");
  14. for (int i = 0; i < LengthA; i++)
  15. {
  16. Console.Write(A[i] + " ");
  17. }
  18. Console.WriteLine();
  19. Console.WriteLine("Повторяющиеся элементы удалены");
  20. var hashsetA = new HashSet<int>();
  21. foreach (var x in A)
  22. if (!hashsetA.Contains(x))
  23. hashsetA.Add(x);
  24. Array.Resize(ref A, hashsetA.Count);
  25. A = hashsetA.ToArray();
  26. foreach (var x in A)
  27. Console.Write("{0} ", x);
  28. for (int i = 0; i < A.Length; i++)
  29. {
  30. for (int j = 0; j < A.Length - 1; j++)
  31. {
  32. if (A[j] > A[j + 1])
  33. {
  34. int z = A[j];
  35. A[j] = A[j + 1];
  36. A[j + 1] = z;
  37. }
  38. }
  39. }
  40. Console.WriteLine();
  41. Console.WriteLine("Элементы отсортированы по возрастанию");
  42. for (int i = 0; i < hashsetA.Count; i++)
  43. {
  44. Console.Write(A[i] + " ");
  45. }
  46. Console.WriteLine();
  47. Console.WriteLine();
  48. Console.WriteLine("введите размерность B ");
  49. int LengthB = Convert.ToInt32(Console.ReadLine());
  50. Console.WriteLine("Вводите элементы множества B");
  51. int[] B = new int[LengthB];
  52. for (int i = 0; i < LengthB; i++)
  53. {
  54. B[i] = Convert.ToInt32(Console.ReadLine());
  55. }
  56. Console.WriteLine("Исходное множество");
  57. for (int i = 0; i < LengthB; i++)
  58. {
  59. Console.Write(B[i] + " ");
  60. }
  61. Console.WriteLine();
  62. Console.WriteLine("Повторяющиеся элементы удалены");
  63. var hashsetB = new HashSet<int>();
  64. foreach (var x in B)
  65. if (!hashsetB.Contains(x))
  66. hashsetB.Add(x);
  67. Array.Resize(ref B, hashsetB.Count);
  68. B = hashsetB.ToArray();
  69. foreach (var x in B)
  70. Console.Write("{0} ", x);
  71. for (int i = 0; i < B.Length; i++)
  72. {
  73. for (int j = 0; j < B.Length - 1; j++)
  74. {
  75. if (B[j] > B[j + 1])
  76. {
  77. int z = B[j];
  78. B[j] = B[j + 1];
  79. B[j + 1] = z;
  80. }
  81. }
  82. }
  83. Console.WriteLine();
  84. Console.WriteLine("Элементы отсортированы по возрастанию");
  85. for (int i = 0; i < hashsetB.Count; i++)
  86. {
  87. Console.Write(B[i] + " ");
  88. }
  89. // алгоритм разности
  90. int a = 0;
  91. int b = 0;
  92. int c = 0;
  93. int[] D = new int[(hashsetA.Count) + (hashsetB.Count)];
  94. while (a < hashsetA.Count && b < hashsetB.Count)
  95. {
  96. if (A[a] == B[b])
  97. {
  98. a++;
  99. b++;
  100. }
  101. else if (B[b] < A[a])
  102. {
  103. c++;
  104. D[c] = A[a];
  105. a++;
  106. }
  107. else if (B[b] > A[a])
  108. {
  109. b++;
  110. }
  111. }
  112. while (a < hashsetA.Count && b > hashsetB.Count)
  113. {
  114. c++;
  115. D[c] = A[a];
  116. a++;
  117. }
  118. Console.WriteLine();
  119. Console.Write(D[c] + " ");
  120. Console.ReadLine();
  121. }
  122. }
Что не так с алгоритмом? То не все элементы вычитаются,то вообще выдает ошибку

Решение задачи: «Разность двух множеств A\B»

textual
Листинг программы
  1.                 if (A[a] == B[b])
  2.                 {
  3.                     a++;
  4.                     b++;
  5.                 }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы