30/09/2018, 16:07

Vòng lặp while hoạt động như thế nào?

#include <stdio.h>
long fact(int n);
long rfact(int n);
int main(void)
{
    int num;
    printf("This program calculates factorials.
");
    printf("Enter a value in the range 0-12 (q to quit):
");
    while (scanf("%d", &num) == 1)
    {
        if (num < 0)
            printf("No negative numbers, please.
");
        else if (num > 12)
            printf("Keep input under 13.
");
        else
        {
            printf("loop: %d factorial = %ld
",
                   num, fact(num));
            printf("recursion: %d factorial = %ld
",
                   num, rfact(num));
        }
        printf("Enter a value in the range 0-12 (q to quit):
");
    }
    printf("Bye.
");
    return 0;
}
long fact(int n) // loop-based function
{
    long ans;
    for (ans = 1; n > 1; n--)
        ans *= n;
    return ans;
}
long rfact(int n) // recursive version
{
    long ans;
    if (n > 0)
        ans= n * rfact(n-1);
    else
        ans = 1;
    return ans;
}

Code trên dùng để tính giai thừa của một số nguyên,bằng hai cách:sử dụng vòng lặp for và đệ quy.Nhưng mình có 2 điểm thắc mắc.
1.Ở câu lệnh:

 while (scanf("%d", &num) == 1)

cụ thể: scanf("%d",&num)==1 ,cái này có ý nghĩa như thế nào vậy mọi người?
2. Nguyên nhân nào làm cho code này có thể lặp lại việc tính giai thừa của nhiều số.(mình nói có vẻ khó hiểu,nếu đúng vậy thì cứ chạy thử code các bạn sẽ hiểu ý mình muốn nói).
Thank you mọi người đã đọc topic này.

Đỗ Trung Quân viết 18:24 ngày 30/09/2018

while (scanf("%d", &num) == 1)

Cái này là điều kiện của vòng while bạn ạ. Nếu số nhập vào ==1. Kiểu như là bạn đã nhập được đúng số kiểu int vào ý. Sẽ chạy các câu bên trong while

Nguyên nhân nào làm cho code này có thể lặp lại việc tính giai thừa của nhiều số

Mình không dùng laptop nên chẳng chạy code được, nguyên nhân là nó dùng vòng lặp + đệ qui bạn ạ :)))). Cứ có việc thì làm thôi.

Phạm Hoàng Tuấn viết 18:16 ngày 30/09/2018
long fact(int n) // loop-based function
{
    long ans;
    for (ans = 1; n < 1; n--)
        ans *= n;
    return ans;
}
giái thừa n=1*2*3 * n

Trong hàm `fact` : hàm `for` sẽ chạy từ n tới 2 (vì nhân vs 1 cũng như không nhân) . mỗi lần lặp, giảm n đi 1 đơn vị
`ans` = n* (n-1) * (n-2) * 2 =n!

Ví dụ nhập 3 vào ->
lặp lần 1:  `asn= ans * 3`
lặp lần 2:  `asn= ans * 2`

`-> ans= 3 *2 =2*3=3!.` . Tương tự cho các n khác

[quote="14520054, post:1, topic:1534"]
while (scanf("%d", &num) == 1)
[/quote]

Vòng while này chỉ có tác dụng để bạn có thể tính giai thừa cho mỗi lần nhập vào số nguyên (tức cứ nhập số nguyên vào là chạy hàm bên trong).
Bài liên quan
0