Tìm dòng có tổng lớn nhất/nhỏ trong ma trận

0
17392

Bài toán: Tìm dòng có tổng lớn/nhỏ nhất trong ma trận

Input: ma trận a có m dòng, n cột

Xử lý:

Trước tiên viết hàm tính tổng các dòng

Duyệt mảng, tính tổng

Dòng 0:s=a[0][1]+a[0][2]+….a[0][n-1]

Dòng 1: s=a[1][1]+a[1][2]+…+a[1][n-1]

Dòng m: s=a[m][0]+a[m][1]+…+a[m][n-1]

Hàm tính tổng dòng

double tong(int a[][MAX], int i, int n)
{
	double s=0;
	for(int j=0;j<n;j++)
		s=s+a[i][j];
	return s;
}

Hàm trả về tổng

Sau đó viết hàm tính tổng dòng lớn nhất

Gán max= tổng dòng 0

Duyệt mảng, gán tong= tong dong m

Rồi so sánh max với tổng. Nếu tổng lớn/nhỏ hơn max thì cập nhật lại giá trị max và vị trí dòng i, để khi duyệt hết mảng sẽ tìm được dòng lớn nhất

Hàm tìm dòng có tổng lớn nhất

int tonglonnhat(int a[][MAX], int m, int n)
{
	int i,d;
	double max=tong(a,0,n);
	for( i=1;i<m;i++)
	{
		double t=tong(a,i,n);
		if(max<t)
		{
			max=t;
			d=i;
		}
	}
	return d;
}

Hàm tìm dòng có tổng nhỏ nhất

int tongnhonhat(int a[][MAX], int m, int n)
{
	int i,d;
	double min=tong(a,0,n);
	for( i=1;i<m;i++)
	{
		double t=tong(a,i,n);
		if(min>t)
		{
			min=t;
			d=i;
		}
	}
	return d;
}

Output: dòng lớn/nhỏ  nhất

Chương trình

#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 100
void nhapmang(int a[][MAX], int &m, int &n);
void xuatmang(int a[][MAX], int m, int n);
double tong(int a[][MAX], int i, int n);
int tonglonnhat(int a[][MAX], int m, int n);
void main()
{
	int a[MAX][MAX], m,n;
	nhapmang(a,m,n);
	printf("\nnoi dung cua ma tran\n");
	xuatmang(a,m,n);
	int kq=tonglonnhat(a,m,n);
	printf("\nDong lon nhat trong ma tran la: %d",kq);
	printf("\nChuc Ban hoc tot");
	getch();
}
void nhapmang(int a[][MAX], int &m, int &n)
{
	int i,j;
	do
	{
		printf("nhap vao so dong cua ma tran: ");
		scanf("%d",&m);
	}while(m<=0);
	do
	{
		printf("nhap vao so cot cua ma tran: ");
		scanf("%d",&n);
	}while(n<=0);
	for( i=0;i<m;i++)
	{
		for( j=0;j<n;j++)
		{
			printf("\nso phan tu a[%d][%d]: ",i,j);
			scanf("%d",&a[i][j]);
		}
	}
}
void xuatmang(int a[][MAX], int m, int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			printf("%5d",a[i][j]);
		}
		printf("\n");
	}
}
double tong(int a[][MAX], int i, int n)
{
	double s=0;
	for(int j=0;j<n;j++)
		s=s+a[i][j];
	return s;
}
int tonglonnhat(int a[][MAX], int m, int n)
{
	int i,d;
	double max=tong(a,0,n);
	for( i=0;i<m;i++)
	{
		double t=tong(a,i,n);
		if(max<t)
		{
			max=t;
			d=i;
		}
	}
	return d;
}

Mình chia sẻ code này để các bạn tham khảo các vấn đề tương tự. Tuy nhiên các bạn nên tự làm lại, đừng nên copy. Nếu gặp vấn đề gì khó khăn, hoặc thắc mắc gì, các bạn có thể đặt câu hỏi ở cuối bài. Mình sẽ giải đáp.

Chúc các bạn thành công!

This site uses Akismet to reduce spam. Learn how your comment data is processed.