Ko biết có phải sai logic ko mà số ra to lắm ạ. giai thừa của các số nhỏ hơn và bằng 5

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

long tinhGT(int N[]);
int main(int argc, char *argv[]) {
	int N[5]={3,7,4,9,5};
	tinhGT(N);
	return 0;
}
long tinhGT(int N[5])
{
	
	long gt=1;
	int i;
	for(i=0;i<5;i++)
	{
		if(N[i]<=5)
		{
			int j;
			for(j=1;j<=N[i];j++)
			{
				gt=gt*j;
			}
			printf("giai thua cua %d:%ld \n",N[i],gt);
		}
	}
	return gt;
}

To là chuyện bình thường. Code bên trên tính giai thừa của các số nhỏ hơn hoặc bằng 5 rồi nhân lại hết với nhau còn gì.
Cụ thể trong trường hợp trên, gt = 3! * 4! * 5!.

bài em đang cần tính gt của các số thôi chứ không cho nó nhân vào nhau ạ.

thế thì bạn tìm cách cho nó trả về 1 mảng hay đại loại thế chứ như bên trên bạn nhân tuốt vào gt rồi còn đâu.

vẫn ko tìm đc cách giải quyết :’(

@Lương_Quang_Mạnh bạn giúp mình đc ko chứ nghĩ hoài ko ra …

Bài làm sai ngay từ đoạn khai báo hàm rồi, sửa gì nữa, có viết lại thì tốt hơn

Bạn có thể tham khảo code này:

#include <stdio.h>

int factorial(int n) {
    /* Calculate the factorial of an integer. */
    if (n <= 1)
        return 1;
    return n * factorial(n - 1);
}

int * factorial_array(int arr[5]) {
    static int res[5];  // result
    int j = 0;  // index of result array
    for (int i = 0; i < 5; i++)
        if (arr[i] <= 5)
            res[j++] = factorial(arr[i]);
    return res;
}

int main() {
    int n[] = {1, 2, 5, 7, 9};
    int * result = factorial_array(n);
    for (int i = 0; i < 5; i++)
        printf("%d\n", result[i]);
    return 0;
}

Hơi lằng nhằng và có thể không phải tốt nhất vì nói thật là mình cũng chưa học đến pointer :stuck_out_tongue_closed_eyes:

Ý kiến của mình: thêm gt = 1; ngay sau int j;, biến gt cần phải reset lại giá trị. That’s it :smiley:
Có hơi liên quan là bạn code hơi lằng nhằng.

Output:

giai thua cua 3:6
giai thua cua 4:24
giai thua cua 5:120

Tuy nhiên, code của bạn ấy chỉ return duy nhất một giá trị, giai thừa của số cuối cùng trong mảng nhỏ hơn hoặc bằng 5. Nếu không thay đổi kiểu dữ liệu trả về, sửa thế cũng không lợi lộc gì, trừ khi tính đến đâu in ra luôn đến đấy.

Tại mình thấy bạn đó muốn vậy mà :joy: Mình nghĩ bạn đó chỉ muốn viết hàm tình giai thừa và tự in ra màn hình luôn. Nếu muốn lấy lại tất cả giá trị thì nhét tụi nó vào lại 1 mảng rồi return. Mình thấy bạn đó để return gt; cho vui chứ đâu xử lý gì đâu, với lại có cả thông báo trong hàm như vậy thì không nhất thiết phải return giá trị làm gì.

@Trong_Tran Lần sau bạn nên giải thích rõ là mục đích code của bạn, lỗi và yêu cầu chỉnh sửa nha. Lỗi thì phải có thông báo lỗi (hay đại loại là thứ gì không theo ý muốn) nữa nha. Không nên thách đố lại người giúp đỡ bạn :smiley:

1 Like

bạn sai ở đây vì chưa hiểu công thức tính giai thừa.
Cách bạn tính là dùng vòng lặp for(j=1;j<n;j++) rồi gán giá trị gt*=j chỉ đúng với trường hợp j=10(10! - cái này mình nghiên cứu từ video của anh Đạt) còn lại đối với giai thừa !=10 đều cho ra kết quả sai.
Tốt nhất bạn nên dùng phương pháp Đệ quy để tính

#include <stdio.h>

int factorial(int n) {
    /* Công thức tính giai thừa  */
    if (n <= 1)
        return 1;
    return n * factorial(n - 1); // sử dụng phương pháp đệ quy
}

int * factorial_array(int arr[5]) {
    static int res[5];  // result
    int j = 0;  // index of result array
    for (int i = 0; i < 5; i++)
        if (arr[i] <= 5) // sét điều kiện.
            res[j++] = factorial(arr[i]); // lấy công thức
    return res;
}

int main() {
    int n[] = {1, 2, 5, 7, 9};
    int * result = factorial_array(n);
    for (int i = 0; i < 5; i++)
        printf("%d\n", result[i]);
    return 0;
}

bạn nghiên cứu về đệ quy trong C nhé

Còn bạn nghiên cứu cái này nè. Post code kiểu đó coi nhức mắt lắm. :joy:

:joy: uk sorry mình chưa đọc bài đó

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