Разность двух множеств 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++;
}