web-dev-qa-db-fra.com

Boucle pour calculer les factorielles

Actuellement, j'ai cet ensemble de code et son but est de calculer les factorielles.

int numberInt = int.Parse(factorialNumberTextBox.Text);

for (int i = 1; i < numberInt; i++)
{
  numberInt = numberInt * i;
}

factorialAnswerTextBox.Text = numberInt.ToString();

Pour une raison quelconque, cela ne fonctionne pas et je ne sais pas pourquoi. Par exemple, j'entrerai 3 et j'obtiendrai la réponse -458131456, ce qui semble vraiment étrange.

Toute aide appréciée. Merci

13
Anthony Johnson
int numberInt = int.Parse(factorialNumberTextBox.Text);
int result = numberInt;

for (int i = 1; i < numberInt; i++)
{
    result = result * i;
}

factorialAnswerTextBox.Text = result.ToString();

sur une note secondaire: ce ne serait normalement pas la bonne façon de calculer les factorielles. Vous aurez besoin d'une vérification de l'entrée avant de pouvoir commencer le calcul, dans le cas où votre valeur de départ est 1 ou inférieure, dans ce cas, vous devez retourner manuellement 1.

Sur une autre note: c'est également un exemple parfait de cas où les méthodes récursives peuvent être utiles.

int Factorial(int i)
{
    if (i <= 1)
        return 1;
    return i * Factorial(i - 1);
}
35
Wim Ombelets

Un peu tard pour la fête:

Func<int, int> factorial = n => n == 0 ? 1 : 
    Enumerable.Range(1, n).Aggregate((acc, x) => acc * x);
23
ebb

Vous pouvez utiliser cette solution (plutôt élégante):

    Func<int, int> factorial = null; 
    factorial = x => x <= 1 ? 1 : x * factorial(x-1);
    int numberInt = int.Parse(factorialNumberTextBox.Text);
    factorialAnswerTextBox.Text = factorial(numberInt).ToString();
5
Ahmed KRAIEM
public static int Factorial(int facno)
{
    int temno = 1;

    for (int i = 1; i <= facno; i++)
    {
        temno = temno * i;
    }

    return temno;
}
3
varun

je suis en retard à la fête mais le voici

    public ulong Factorial(uint numb)
    {
        if (numb <= 1) return 1;
        ulong final = 1;
        for (uint i = 1; i <= numb; i++)
        {
            final *= i;
        }
        return final;
    }

Remarque:
J'ai utilisé des types non signés pour une meilleure portée
car cela calcule jusqu'à Factorial (65), tandis que les types signés normaux donneront des valeurs négatives

2
bigworld12

Essayer de faire une solution plus à l'épreuve des balles pour n factorielle. En voici une qui protège des débordements, ainsi que des valeurs négatives et nulles de n. L'utilisation d'une variable de résultat de type long (au lieu de int) permet de calculer des valeurs "plus grandes" (pour long, vous pouvez calculer jusqu'à n = 20 inclus).

Ce code renvoie 0 si un débordement s'est produit, mais vous pouvez le modifier pour faire ce qui est plus approprié.

    static long nFactorial(int n)
    {
        if (n <= 1)
        {
            return 1;
        }
        long result = 1;
        try
        {
            for (int i = 1; i <= n; i++)
            {
                result = checked(result * i); 
            }
        }
        catch (OverflowException)
        {
            return 0;
        }
        return result;
    }
1
BogdanaBotez
static void Main()
{
    int numberFactorial = int.Parse(Console.ReadLine());
    int result = numberFactorial;

    for (int i = 1; i < numberFactorial; i++)
    {
        result = result * i;
        Console.WriteLine("{0}*{1}",numberFactorial,i);
    }
    Console.WriteLine(result);
}
0
KlimentHristov

Essaye ça,

int numberInt = int.Parse(textBox1.Text);
        int answer = 1;
        for (int i = 1; i <= numberInt; i++)
        {
            answer = answer * i;
        }

        textBox1.Text = answer.ToString();
0
anupama.kp

J'ai dû créer une méthode factorielle pour calculer les combinaisons et j'ai trébuché sur le fait que les factorielles deviennent très grandes très rapidement avec des entrées relativement petites. Voici ma solution sans utiliser la récursivité pour éviter le débordement de pile et implémentée à l'aide de System.Numerics.BigInteger.

static BigInteger factorial(int num) {
    BigInteger result = 1;
    while (num > 1) {
        result *= num--;
    }
    return result;
}

Évidemment, vous pouvez également utiliser BigInteger pour l'entrée, mais mon cas d'utilisation était que je traitais des valeurs de int.

0
Jack Pines

Une belle solution factorielle pour votre belle soirée.

int num = Convert.ToInt32(Console.ReadLine());
int fact = 1;
for (int i = num; i > 0; --i)
    fact *= i;
Console.WriteLine(fact);
0
Wael Assaf

utiliser la fonction factorielle:

static long Factorial(long number)
    {
    if( number <= 1 )
        return 1;
    else
        return number * Factorial(number - 1);
    }

puis appelez la fonction:

long result = Factorial(int.Parse(factorialNumberTextBox.Text));
factorialAnswerTextBox.Text = result.ToString();
0
Pritesh Tayade
 int numberInt=1 ;

            for (int i = 1; i <= int.Parse(factorialNumberTextBox.Text); i++)
            {

                numberInt = numberInt * i;
            }

            factorialNumberTextBox.Text = numberInt.ToString();
0
Sathish

Deux méthodes sont implémentées: récursive et basique calcul factoriel.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication50
{
    class Program
    {
        static void Main(string[] args)
        {

        NumberManipulator manipulator = new NumberManipulator();
        Console.WriteLine("Please Enter Factorial Number:");
        int a= Convert.ToInt32(Console.ReadLine());

        Console.WriteLine("---Basic Calling--");
        Console.WriteLine("Factorial of {0} is: {1}" ,a, manipulator.factorial(a));

        Console.WriteLine("--Recursively Calling--");
        Console.WriteLine("Factorial of {0} is: {1}", a, manipulator.recursively(a));

        Console.ReadLine();
    }
}

class NumberManipulator
{
    public int factorial(int num)
    {
        int result=1;
        int b = 1;
        do
        {
            result = result * b;
            Console.WriteLine(result);
            b++;
        } while (num >= b);
        return result;
    }

    public int recursively(int num)
    {
        if (num <= 1)
        {
            return 1;
        }
        else
        {
            return recursively(num - 1) * num;
        }
    }
  }
}
0
casillas