Est-il possible de comparer ce qui factorielle du nombre est plus élevé chez les deux nombres sans calcul?
Le scénario est je suis entrain de créer une application console c# qui prend deux factorielle intrants, comme la
123!!!!!!
456!!!
tout ce que je veux faire, c'est de comparer ce qui factorielle valeur est plus grande que les autres, le morceau de code que j'ai fait est
try
{
string st = Console.ReadLine();
Int64 factCount = 0;
while (st.Contains('!'))
{
factCount = st.Where(w => w == '!').Count();
st = st.Replace('!', ' ');
};
decimal result = 1 ;
for (Int64 j = 0; j < factCount; j++)
{
UInt64 num = Convert.ToUInt64(st.Trim());
for (UInt64 x = num; x > 0; x--)
{
result = result * x;
}
}
if (factCount == 0)
{
result = Convert.ToUInt64(st.Trim());
}
string st2 = Console.ReadLine();
Int64 factCount2 = 0;
while (st2.Contains('!'))
{
factCount2 = st2.Where(w => w == '!').Count();
st2 = st2.Replace('!', ' ');
};
decimal result2 = 1;
for (Int64 j = 0; j < factCount2; j++)
{
UInt64 num = Convert.ToUInt64(st.Trim());
for (UInt64 x = num; x > 0; x--)
{
result2 = result2 * x;
}
}
if (factCount2 == 0)
{
result2 = Convert.ToUInt64(st2.Trim());
}
if (result == result2)
{
Console.WriteLine("x=y");
}
else if (result < result2)
{
Console.WriteLine("x<y");
}
else if (result > result2)
{
Console.WriteLine("x>y");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
mais l'erreur que j'obtiens est
la valeur est trop grande ou trop petite pour les décimales
J'ai compris l'erreur, mais est-il possible de faire cela
S'il vous plaît suggérer que tout autre type de données qui accueillir valeur supérieure à virgule ou est-il un autre moyen de comparer ces factorielles
Après la mise en œuvre de @Bethsabée suggestion, je change un peu de mon code
string st = Console.ReadLine();
int factCount = 0;
while (st.Contains('!'))
{
factCount = st.Where(w => w == '!').Count();
st = st.Replace('!', ' ');
};
string st2 = Console.ReadLine();
int factCount2 = 0;
while (st2.Contains('!'))
{
factCount2 = st2.Where(w => w == '!').Count();
st2 = st2.Replace('!', ' ');
};
int resultFactCount = factCount - factCount2;
decimal result = 1;
decimal result2 = 1;
if (resultFactCount > 0)
{
for (Int64 j = 0; j < resultFactCount; j++)
{
UInt64 num = Convert.ToUInt64(st.Trim());
for (UInt64 x = num; x > 0; x--)
{
result = result * x;
}
}
if (factCount == 0)
{
result = Convert.ToUInt64(st.Trim());
}
UInt64 num1 = Convert.ToUInt64(st.Trim());
if (result == num1)
{
Console.WriteLine("x=y");
}
else if (result < num1)
{
Console.WriteLine("x<y");
}
else if (result > num1)
{
Console.WriteLine("x>y");
}
}
else
{
int resultFactCount1 = System.Math.Abs(resultFactCount);
for (Int64 j = 0; j < resultFactCount1; j++)
{
UInt64 num = Convert.ToUInt64(st.Trim());
for (UInt64 x = num; x > 0; x--)
{
result2 = result2 * x;
}
}
if (factCount2 == 0)
{
result2 = Convert.ToUInt64(st2.Trim());
}
UInt64 num1 = Convert.ToUInt64(st.Trim());
if (result2 == num1)
{
Console.WriteLine("x=y");
}
else if (result2 < num1)
{
Console.WriteLine("x<y");
}
else if (result2 > num1)
{
Console.WriteLine("x>y");
}
}
Désolé de le dire mais encore 123!!! c'est tellement énorme que j'obtiens le même message d'erreur
Traditionnellement
m!!...!
avecn
!
s signifiem(m-n)(m-2n)....
cependant, ici, est pris comme(...((m!)!)!...)!
Note de l'Alec, oui, je sais, c'est un malheureux la notation, mais vous voyez la définition conventionnelle est beaucoup plus utile (dans le domaine de la combinatoire, l'endroit où les factorielles venir) que celui que l'OP veut.
Je mettrais cela dans un commentaire, mais ce serait éclipsé par les autres et c'est tout à fait important.