Tính giai thừa cho kết quả sai

Đệ viết được 1 chương trình tính Giai thừa của một số tự nhiên.
nhưng nó chỉ chạy đúng đến 12! thôi.
Bắt đầu từ 13! thì Kết quả Sai so với Kết quả tính toán từ ExceLL.
Có Pro nào rảnh giải thích giùm đệ nhé.

#include <stdio.h>
#include <stdlib.h>

/*Chuong trinh tinh toan Giai thua cua mot so Tu Nhien*/

int clean_stdin() {
    while (getchar() != '\n') {
    }
    return 1;
}

void Numerical_input(int *input_coefficient)
{
    int input;
    char c;
    int counter=1;

    do {
        //printf("Enter an integer: ");
        if (counter>1)
            printf("\nEnter Again: ");
        ++counter;
    } while (((scanf("%d%c", &input, &c) != 2 || c != '\n') && clean_stdin()));
	
    *input_coefficient = input;
}

unsigned long GiaiThua(int a)
{
    if (a>1)
        return a*GiaiThua(a-1);
    else
        return (1);

}
int main()
{
    int N;
    int input_char;

    do
    {
        printf("Chuong trinh tinh toan Giai thua N!\n");
        printf("Nhap vao so tu nhien: \tN = ");
        Numerical_input(&N);

        printf("\tKet qua tinh toan:\n");
        printf("\t%d! = %lu\n",N,GiaiThua(N));

        printf("Do you want to Escape (Y\\N)??");
        input_char = getchar();

        if (input_char==89 || input_char==121){
            printf("\nThanks for Using!!!\n\tBye Bye!\n");
            break;
        }
        else
            system("cls");
    } while (input_char!=89 && input_char!=121);

    system("pause");
    return 0;
}

Kết quả sai ra sao vậy bạn?

2 Likes


Theo ExceLL: 13! = 6.227.020.800
Còn kết quả Lập trình của đệ thì: 13! = 1.932.053.504
đệ không hiểu tại sao SAI??

Kiểu int chỉ từ -2.147.483.648 đến 2.147.483.647 thôi.

Muốn to nữa phải xài long long int, hoặc tìm hiểu về big number. :smiley:

3 Likes

Đệ sử dụng: ‘unsigned long’ mà.

image

long long mới 8 bytes. :upside_down_face:
https://docs.microsoft.com/en-us/cpp/cpp/integer-limits?view=vs-2019

3 Likes

Xem để biết chi tiết hơn nhé: https://en.cppreference.com/w/cpp/language/types

2 Likes
#include <stdio.h>
#include <stdlib.h>

/*Chuong trinh tinh toan Giai thua cua mot so Tu Nhien*/

int clean_stdin() {
    while (getchar() != '\n') {
    }
    return 1;
}

void Numerical_input(int *input_coefficient)
{
    int input;
    char c;
    int counter=1;

    do {
        //printf("Enter an integer: ");
        if (counter>1)
            printf("\nEnter Again: ");
        ++counter;
    } while (((scanf("%d%c", &input, &c) != 2 || c != '\n') && clean_stdin()));

    *input_coefficient = input;
}

long long GiaiThua(int a)
{
    if (a>1)
        return a*GiaiThua(a-1);
    else
        return (1);

}
int main()
{
    int N;
    int input_char;

    do
    {
        printf("Chuong trinh tinh toan Giai thua N!\n");
        printf("Nhap vao so tu nhien: \tN = ");
        Numerical_input(&N);

        printf("\tKet qua tinh toan:\n");
        printf("\t%d! = %lu\n",N,GiaiThua(N));

        printf("Do you want to Escape (Y\\N)??");
        input_char = getchar();

        if (input_char==89 || input_char==121){
            printf("\nThanks for Using!!!\n\tBye Bye!\n");
            break;
        }
        else
            system("cls");
    } while (input_char!=89 && input_char!=121);

    system("pause");
    return 0;
}

Sửa Lại thành ‘Long Long’ rồi Pro ơi.
Nhưng vẫn sai.

image

Cái dòng Lệnh số 48 như hình: đệ sử dụng ‘%lu’ như thế có đúng không ạ??

Nhớ là llu mới đúng. :V


Klq nhưng mà bạn qua đây đọc cách post code nha, toàn được Situ Ca sửa cho hoài. :kissing:

5 Likes

đã sửa và đạt được kết quả như ý.
Cảm ơn Pro ‘Sherly1001’ nhiều nhiều nhé.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?