Liệt kê số hoàn hảo trong mảng 2 chiều

Cho em hỏi đoạn code này sai ở đâu?

#include<stdio.h>
void HamNhap(int a[][100], int &n, int &m)
{
	int i, j;
	printf("Cho biet so dong va cot cua mang: ");
	scanf("%d", &n);
	scanf("%d", &m);
	for(i=0; i<n; i++)
	for(j=0; j<m; j++)
	{
		printf("Gia tri phan tu a[%d][%d]=", i, j);
		scanf("%d", &a[i][j]);
	}
}
int main()
{
	int a[100][100],n,m,i,j,k;
	HamNhap(a,n,m);
	int sum=0;
	for(int i=0; i<n; i++)
	for(int j=0; j<m; j++)
	{
		if(a[i][j]<0)
		return 0;
		for(k=1;k<a[i][j];k++)
		{
		if(a[i][j]%k==0)
		sum=sum+k;
		}
	if(sum==a[i][j])
	{
		printf("%d",a[i][j] );	
	}
	}	
}

Bạn muốn hỏi gì ?? Với cả Markdown code nhé :slight_smile:

2 Likes

À mình vửa chỉnh lại rồi, cảm ơn bạn đã nhắc

2 Likes

Bạn nên nêu rõ lỗi gặp phải như thế nào, tốt nhất là kèm theo cả thông báo lỗi.

1 Like

Nhìn qua code của bạn thì thấy một số điểm sau:

  • [quote=“Hieu_Dang, post:1, topic:70737”]
    void HamNhap(int a[][100], int &n, int &m)
    [/quote]

Trong C không có truyền tham chiếu int &n, int &m, bạn có thể thay thế bằng con trỏ, int *n , int *m. Trong hàm main bạn khai báo thừa, hai lần biến i, j. Khi khai báo biến int i/ int j trong vòng lặp for thì hai biến này sẽ chỉ tồn tại trong khối lệnh của vòng for. Còn hai biến i, j ở trong lệnh khai báo đầu tiên của hàm main không hề được sử dụng.

1 Like

Nó không báo lỗi nhưng khi mình nhập vào thì nó không ra kết quả bạn ơi, và mình để int&n, int&m vẫn chạy được vì mình để chương trình là cpp nên vẫn chạy được, có vấn đề là khi mình bỏ dấu & đi thì kết quả nó ra khá tào lao nên mình cũng không biết phải sửa thế nào :tired_face:

Quên trả giá trị sum về 0 sau mỗi lần kiểm tra

for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
sum = 0;

1 Like

Nếu bạn viết chương trình C++ thì có thể dùng tham chiếu, tuy nhiên nếu viết bằng C thì bạn nên dùng con trỏ cũng có thể cho kết quả tương đương.

Tham khảo
#include<stdio.h>

void HamNhap(int **a, int *hang, int *cot)
{
	int i, j;
	
	for(i = 0; i < *hang; i++)
	for(j = 0; j < *cot; j++)
	{
		printf("a[%d][%d] = ", i, j);
		scanf("%d", (*(a + i) + j));
	}
}

void HamXuat(int **a, int hang, int cot)
{
    int i, j;
	for(i = 0; i < hang; i++)
	{
    	for(j = 0; j < cot; j++)
    	{
    		printf("%d ", *(*(a + i) + j));
    	}
    	printf("\n");
	}
}

int KiemTraSoHoanHao(int num)
{
    int sum = 0;
    if(num < 0)
	    return 0;
	for(int k = 1; k < num; k++)
	{
		if(num % k == 0)
		    sum = sum + k;
	}
	if(sum == num)
	    return 1;
        return 0;
}

int main()
{
    int n, m;
    int sum = 0;
    int **a = NULL;
    
    printf("Nhap so hang: ");
    scanf("%d", &n);
    printf("Nhap so cot: ");
    scanf("%d", &m);
    a = (int**) malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        a[i] = (int**) malloc(m * sizeof(int));
    }
    HamNhap(a, &n, &m);
    HamXuat(a, n, m);
    for(int i = 0; i < n; i++)
    {
    	for(int j = 0; j < m; j++)
    	{
    	    if(KiemTraSoHoanHao(a[i][j]))
        	{
        	    printf("a[%d][%d] = %d la so hoan hao\n", i, j, a[i][j]);
        	}
        }
    }
    for (int i = 0; i < m; i++)
    {
        free(a[i]);
        a[i] = NULL;
    }
    free(a);
    a = NULL;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?