Lỗi sai về mảng

Mọi người chỉ lỗi sai giúp mình với. Đề bài : nhập xuất mảng,tìm vị trí số hoàn thiện cuối cùng của mảng

#include<conio.h>
#include<stdio.h>
#define MAX 100

void nhap_mang(int mang[],int &n)
{
	do
	{
		printf("139: vi tri hoan thien cuoi cung\n");
		printf("nhap va so phan tu cho mang(0<mang<=100) :");
		scanf_s("%d",&n);
		if(n<0||n>MAX)
		printf("kiem tra dieu kien va nhap lai !!!");
	}
	while(n<0||n>MAX);
	for(int i=0;i<n;i++)
	{
		printf("mang[%d]:",i);
		scanf_s("%d",&mang[i]);
	}
}
void mang_o(int mang[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf(" %d ",mang[i]);
	}
}
int de_bai(int mang[],int &n)
{
	int i;
	int tong=0;
	for(i=n-1;i>0;i--)
	{
		mang[i];
		for(int j=1;j<mang[i];j++)
		{
			if(mang[i]%j==0)
			{tong=tong+j;}
			
		}
	}
	if(tong==mang[i]);
		return i;
	}
int main()
{
	int n;
	int mang[MAX];
	nhap_mang(mang,n);
	mang_o(mang,n);
	de_bai(mang,n);
	printf("vi tri hoan thien cuoi cung la %d",de_bai(mang,n));
	_getch();
	return 0;
}

Bạn thử viết cho mình một cái hàm riêng dùng để kiểm tra số hoàn thiện xem?
Nếu là số hoàn thiện thì trả về 1, ngược lại trả về 0.

#include<conio.h>
#include<stdio.h>
void main()
{
	int m=0;
	int a;
	printf("nhap vao mot so duong :");
	scanf_s("%d",&a);
	for(int i=1;i<a;i++)
	{
		if(a%i==0)
		{m=m+i;}
	}
	if(m=a)
		printf("%d la so hoanchinh",a);
	else 
		printf("0");
_getch();
}

cái này nhét vào vòng for

mình thử và ko được bạn ak

ra khỏi vòng for thứ 2 thì cho lại tong=0 và cuối hàm return -1; nếu không có phần tử nào

Giờ mới để ý, bỏ ; chỗ if đi

5 số bạn nhập trong hình có số nào là hoàn thiện đâu ?
Mà bạn nên nói sơ về thuật toán của bạn xíu để người fix sẽ hiểu rõ và tìm lỗi nhanh hơn chứ như vầy tìm lâu lắm :slight_smile:

Mình xin “phát biểu” thuật toán của mình nhé: Viết 1 hàm kiểm tra số hoàn thiện (bool). Sau đó trong hàm de_bai bạn chỉ việc tạo 1 vòng for duyệt từ cuối mảng đến đầu mảng ( for (int i = n - 1; i >= 0; i--) ) và trong vòng for đó, nếu phần tử đang xét là số hoàn thiện thì return n

1 Like

int de_bai(int mang[],int &n)
{
	int i;
	int tong=0;
	for(i=n-1;i>0;i--)
	{
		for(int j=1;j<mang[i];j++)
		{
			if(mang[i]%j==0)
			{
			    tong=tong+j;
                        }
                }
                if(tong==mang[i])
                        return i+1;
                tong=0;
        }
	return -1;
}

Giai thích vì sao return i+1 vậy bạn

return i cũng dc. Cái này thì do mảng bắt đầu từ 0 mà theo người dùng thì bắt đầu từ 1 =))

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