it-swarm.com.de

For-Schleife zur Berechnung von Fakultäten

Derzeit habe ich diesen Code-Satz und er soll Fakultäten berechnen.

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

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

factorialAnswerTextBox.Text = numberInt.ToString();

Aus irgendeinem Grund funktioniert es nicht und ich habe keine Ahnung warum. Zum Beispiel werde ich 3 eingeben und die Antwort als -458131456 erhalten, was wirklich seltsam erscheint.

Jede Hilfe dankbar. Vielen Dank

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();

nebenbei bemerkt: Dies wäre normalerweise NICHT die richtige Methode zur Berechnung von Fakultäten. Sie müssen die Eingabe überprüfen, bevor Sie mit der Berechnung beginnen können. Wenn Ihr Startwert 1 oder niedriger ist, müssen Sie in diesem Fall manuell 1 zurückgeben.

Eine weitere Randnotiz: Dies ist auch ein perfektes Beispiel dafür, wo rekursive Methoden nützlich sein können.

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

Ein bisschen zu spät zur Party:

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

Sie können diese (ziemlich elegante) Lösung verwenden:

    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

ich bin zu spät zur Party, aber hier ist es

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

Hinweis:
Ich habe nicht signierte Typen für eine bessere Reichweite verwendet
, da dies bis zu Factorial (65) berechnet, während normale vorzeichenbehaftete Typen negative Werte ergeben

2
bigworld12

Der Versuch, eine kugelsichere Lösung für n Fakultät zu machen. Hier ist eine, die auf Überläufe sowie negative und Null-Werte von n achtet. Wenn Sie eine Ergebnisvariable vom Typ long (anstelle von int) verwenden, können Sie "größere" Werte berechnen (für long können Sie bis zu n = 20 berechnen).

Dieser Code gibt 0 zurück, wenn ein Überlauf aufgetreten ist, aber Sie können ihn ändern, um das zu tun, was angemessener ist.

    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

Versuche dies,

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

Ich musste eine faktorielle Methode zur Berechnung von Kombinationen erstellen und dabei darüber hinwegsehen, dass Fakultäten mit relativ kleinen Eingaben sehr schnell sehr groß werden. Hier ist meine Lösung ohne Verwendung von Rekursion, um einen Stapelüberlauf zu vermeiden, und implementiert mit System.Numerics.BigInteger.

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

Natürlich könnten Sie auch BigInteger für die Eingabe verwenden, aber mein Anwendungsfall war, dass ich int Werte verarbeitete.

0
Jack Pines

Eine nette faktorielle Lösung für Ihren schönen Abend.

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

fakultätsfunktion verwenden:

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

und dann die Funktion aufrufen:

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

Zwei Methoden sind implementiert: Rekursiv und Grundlegend Fakultätsberechnung.

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