web-dev-qa-db-ja.com

階乗を計算するForループ

現在、このコードのセットがあり、階乗を計算するためのものです。

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

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

factorialAnswerTextBox.Text = numberInt.ToString();

なんらかの理由でそれは機能せず、その理由はわかりません。たとえば、私は3を入力し、答えを-458131456として取得しますが、これは本当に奇妙に思えます。

任意の助けに感謝します。ありがとう

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

補足:これは通常、階乗を計算する正しい方法ではありません。開始値が1以下の場合、計算を開始する前に入力をチェックする必要があります。その場合、手動で1を返す必要があります。

もう一つの注意点:これは、再帰的メソッドが有用な場合の完璧な例でもあります。

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

パーティーに少し遅れて:

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

この(かなりエレガントな)ソリューションを使用できます。

    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

私はパーティーに遅れていますが、ここにあります

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

注意:
私はより良い範囲のために符号なしの型を使用しました
これはFactorial(65)まで計算されるため、通常の符号付きタイプは負の値を返します

2
bigworld12

N階乗のより防弾ソリューションを作成しようとしています。 nの負の値とゼロの値と同様に、オーバーフローをガードするものがあります。 (intではなく)long型の結果変数を使用すると、「より大きい」値を計算できます(長い場合、n = 20まで計算できます)。

オーバーフローが発生した場合、このコードは0を返しますが、より適切なことを行うように変更できます。

    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

これを試して、

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

組み合わせを計算するための階乗法を作成する必要があり、比較的小さな入力で階乗が非常に速くなるという事実につまずきました。再帰を使用せずにスタックオーバーフローを回避し、System.Numerics.BigIntegerを使用して実装した私のソリューションを次に示します。

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

明らかに、入力にBigIntegerを使用することもできますが、私のユースケースでは、int値を処理していました。

0
Jack Pines

素敵な夜のための素敵な階乗解。

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

階乗関数を使用する:

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

そして、関数を呼び出します:

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

2つのメソッドが実装されています:再帰および基本階乗計算。

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