Câu hỏi Đối với vòng lặp để tính giai thừa


Hiện tại tôi có bộ mã này và ý nghĩa của nó để tính giai thừa.

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

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

factorialAnswerTextBox.Text = numberInt.ToString();

Đối với một số lý do nó không hoạt động và tôi không có lý do tại sao. Ví dụ tôi sẽ nhập 3 và nhận được câu trả lời là -458131456 có vẻ thực sự lạ.

Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn


12
2018-05-16 09:26


gốc


Bạn thay đổi điều kiện vòng lặp numberInt trong vòng lặp. Sử dụng một biến khác. - I4V
bạn đang thay đổi giá trị của biến numberInt bên trong vòng lặp for, và cùng một biến được sử dụng để so sánh. - Amar
Ngoài ra, hãy lưu ý rằng sử dụng 32 bit int bạn sẽ chỉ có thể tính toán đến 12 giai thừa. Có lẽ xem xét sử dụng 64bit long thay thế. EDIT: Vâng, long chỉ tốt cho tới 20 giai thừa. :) EDIT: Mang trên BigInteger! - Chris Sinclair


Các câu trả lời:


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

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

factorialAnswerTextBox.Text = result.ToString();

trên một mặt lưu ý: điều này thường sẽ KHÔNG là cách chính xác để tính giai thừa. Bạn sẽ cần một kiểm tra về đầu vào trước khi bạn có thể bắt đầu tính toán, trong trường hợp giá trị bắt đầu của bạn là 1 hoặc thấp hơn, trong trường hợp đó bạn cần phải trả lại thủ công 1.

Một lưu ý khác: đây cũng là một ví dụ hoàn hảo về nơi các phương thức đệ quy có thể hữu ích.

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

33
2018-05-16 09:34



Cảm ơn anh em về sự giúp đỡ! Hoàn hảo :) - Anthony Johnson
1 để bao gồm giải pháp đệ quy. - Three Value Logic
Lưu ý rằng điều này không xử lý trường hợp cho 0 !, kết quả trong đó phải là 1. - Matthew Watson
nó sẽ chỉ hoạt động nếu numberInt nhỏ hơn 20, cho các giá trị lớn hơn, tràn kết quả nguyên sẽ xảy ra. - MAK


Một chút muộn cho bữa tiệc:

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

21
2018-02-08 22:21



Giải pháp tốt đẹp nhưng bạn nên xem xét để bắt n = 0 và ngắn mạch để trở về 1 - Dave Lawrence
@ daveL: Good point .. - cập nhật câu trả lời. - ebb
@ JorisBrauns: Không thực sự ... Đó là đệ quy đuôi, và sẽ không gây ra một tràn ngăn xếp nếu đưa ra một số đủ cao như đầu vào. Các giải pháp đệ quy của Wim Ombelets cuối cùng sẽ. - ebb
Nó hoạt động cho đến 12! )) Không thể thay đổi thành BigInteger vì Enumerable.Range (1, n) - it3xl
Enumerable.Range (1, n) .Chọn (el => (BigInteger) el) .Gregregate ((accum, x) => accum * x); - it3xl


Bạn có thể sử dụng giải pháp này (khá thanh lịch):

    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
2018-05-16 09:45



tuyệt tôi thích nó - Wim Ombelets


public static int Factorial(int facno)
{
    int temno = 1;

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

    return temno;
}

3
2018-05-16 09:37





sử dụng hàm giai thừa:

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

và sau đó gọi hàm:

long result = Factorial(int.Parse(factorialNumberTextBox.Text));
factorialAnswerTextBox.Text = result.ToString();

0
2018-05-16 09:38





 int numberInt=1 ;

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

                numberInt = numberInt * i;
            }

            factorialNumberTextBox.Text = numberInt.ToString();

0
2018-05-16 09:38





Thử cái này,

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

        textBox1.Text = answer.ToString();

0
2018-05-16 09:55