using
System;
class
Program
{
static
Tuple<
int
,
int
> AlternateXYApproach(
int
X,
int
Y)
{
if
(X <= 0 || Y <= 0)
{
return
Tuple.Create(X, Y);
}
else
if
(X >= 2 * Y)
{
return
AlternateXYApproach(X - 2 * Y, Y);
}
else
if
(Y >= 2 * X)
{
return
AlternateXYApproach(X, Y - 2 * X);
}
else
{
return
Tuple.Create(X, Y);
}
}
static
void
Main(
string
[] args)
{
int
X1 = 12;
int
Y1 = 5;
Tuple<
int
,
int
> result1 = AlternateXYApproach(X1, Y1);
Console.WriteLine(
"Input: X="
+ X1 +
", Y="
+ Y1);
Console.WriteLine(
"Output: X="
+ result1.Item1 +
", Y="
+ result1.Item2);
Console.WriteLine(
"Explanation:"
);
while
(result1.Item1 > 0 && result1.Item2 > 0)
{
if
(result1.Item1 >= 2 * result1.Item2)
{
result1 = Tuple.Create(result1.Item1 - 2 * result1.Item2, result1.Item2);
}
else
if
(result1.Item2 >= 2 * result1.Item1)
{
result1 = Tuple.Create(result1.Item1, result1.Item2 - 2 * result1.Item1);
}
else
{
break
;
}
if
(result1.Item1 >= 0)
{
Console.WriteLine(
" --> X="
+ result1.Item1 +
", Y="
+ result1.Item2 +
" (as X = X-2*Y)"
);
}
else
{
Console.WriteLine(
" --> X="
+ result1.Item1 +
", Y="
+ result1.Item2 +
" (as Y = Y-2*X)"
);
}
}
Console.WriteLine(
" --> Stop (as X = 0)"
);
Console.WriteLine();
int
X2 = 31;
int
Y2 = 12;
Tuple<
int
,
int
> result2 = AlternateXYApproach(X2, Y2);
Console.WriteLine(
"Input: X="
+ X2 +
", Y="
+ Y2);
Console.WriteLine(
"Output: X="
+ result2.Item1 +
", Y="
+ result2.Item2);
Console.WriteLine(
"Explanation:"
);
while
(result2.Item1 > 0 && result2.Item2 > 0)
{
if
(result2.Item1 >= 2 * result2.Item2)
{
result2 = Tuple.Create(result2.Item1 - 2 * result2.Item2, result2.Item2);
}
else
if
(result2.Item2 >= 2 * result2.Item1)
{
result2 = Tuple.Create(result2.Item1, result2.Item2 - 2 * result2.Item1);
}
else
{
break
;
}
if
(result2.Item1 >= 0)
{
Console.WriteLine(
" --> X="
+ result2.Item1 +
", Y="
+ result2.Item2 +
" (as X = X-2*Y)"
);
}
else
{
Console.WriteLine(
" --> X="
+ result2.Item1 +
", Y="
+ result2.Item2 +
" (as Y = Y-2*X)"
);
}
}
Console.WriteLine(
" --> Stop (as Y < 2*X)"
);
Console.ReadKey();
}
}