現在、このコードのセットがあり、階乗を計算するためのものです。
int numberInt = int.Parse(factorialNumberTextBox.Text);
for (int i = 1; i < numberInt; i++)
{
numberInt = numberInt * i;
}
factorialAnswerTextBox.Text = numberInt.ToString();
なんらかの理由でそれは機能せず、その理由はわかりません。たとえば、私は3を入力し、答えを-458131456として取得しますが、これは本当に奇妙に思えます。
任意の助けに感謝します。ありがとう
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);
}
パーティーに少し遅れて:
Func<int, int> factorial = n => n == 0 ? 1 :
Enumerable.Range(1, n).Aggregate((acc, x) => acc * x);
この(かなりエレガントな)ソリューションを使用できます。
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();
public static int Factorial(int facno)
{
int temno = 1;
for (int i = 1; i <= facno; i++)
{
temno = temno * i;
}
return temno;
}
私はパーティーに遅れていますが、ここにあります
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)まで計算されるため、通常の符号付きタイプは負の値を返します
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;
}
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);
}
これを試して、
int numberInt = int.Parse(textBox1.Text);
int answer = 1;
for (int i = 1; i <= numberInt; i++)
{
answer = answer * i;
}
textBox1.Text = answer.ToString();
組み合わせを計算するための階乗法を作成する必要があり、比較的小さな入力で階乗が非常に速くなるという事実につまずきました。再帰を使用せずにスタックオーバーフローを回避し、System.Numerics.BigInteger
を使用して実装した私のソリューションを次に示します。
static BigInteger factorial(int num) {
BigInteger result = 1;
while (num > 1) {
result *= num--;
}
return result;
}
明らかに、入力にBigInteger
を使用することもできますが、私のユースケースでは、int
値を処理していました。
素敵な夜のための素敵な階乗解。
int num = Convert.ToInt32(Console.ReadLine());
int fact = 1;
for (int i = num; i > 0; --i)
fact *= i;
Console.WriteLine(fact);
階乗関数を使用する:
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();
int numberInt=1 ;
for (int i = 1; i <= int.Parse(factorialNumberTextBox.Text); i++)
{
numberInt = numberInt * i;
}
factorialNumberTextBox.Text = numberInt.ToString();
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;
}
}
}
}