01/10/2018, 12:25

Tìm tích lớn nhất của 3 số trong mảng

Mình có đoạn code sau mà chỉ xuất ra được tích lớn nhất của 3 số nhưng mà tới khi xuất ra 3 số đó thì có không bị trùng hoặc có cái bị trùng
Đề kêu nhập vào n số nguyên với n<=30000,a[i]<=10000.Tìm 3 số sao cho tích của chúng là lớn nhất

#include <iostream>
using namespace std;
void nhap(int a[], int &n);
void xuat(int a[], int n);
void tich(int a[], int n);

int main()
{
	int n,a[30000];
	nhap(a,n);
	xuat(a,n);
	cout << endl;
	tich(a, n);
	cout << endl;
	system("pause");
	return 0;
}

void nhap(int a[], int &n)
{
	do
	{
		cout << "
Nhap vao n so nguyen: ";cin >> n;
		if (n > 30000)
			cout << "
Moi nhap lai dung yeu cau!";
	} while (n > 30000);
	for (int i = 0;i < n;i++)
	{
		cout << "a[" << i << "]= ";
		cin >> a[i];
	}
}

void xuat(int a[], int n)
{
	cout << "Cac so trong day: ";
	for (int i = 0;i < n;i++)
	{
		cout << a[i] << " ";
	}
	
}

void tich(int a[], int n)
{
	int max = 0, maxk = a[2], maxj = a[1], maxi = a[0];
	for (int i = 0;i < n;i++)
	{
		for (int j = i + 1;j < n;j++)
		{
			for (int k = j + 1;k < n;k++)
			{
				if ((a[i] != a[j]) && (a[j] != a[k]) && (a[i] != a[k]))
				{
					int t = (a[i] * a[j] * a[k]);
					if (max < t)
						max = t; 
				}
				if (maxk < a[k]) maxk = a[k];
			}
			if (maxj < a[j]) maxj = a[j];
		}
		if (maxi < a[i]) maxi = a[i];
	}
	cout << "Tich lon nhat trong day so: " << max << endl;
	cout <<maxi<<" "<<maxj<<" "<<maxk;
}

Ai có thể góp ý cho mình được không ? Xin cảm ơn.

rogp10 viết 14:28 ngày 01/10/2018

Nếu abs(a[i]) không vượt quá 10k thì tích 3 số có thể lên đến +/-10^12 => phải xem lại sizeof(int). Đó là chưa kể yêu cầu không có trị tuyệt đối.

Thật sự tích max thì phải dương và có trị tuyệt đối cao nhất trong số đó. Chỉ có hai trường hợp khả dĩ và dùng tính đơn điệu là ko cần lồng for. Dĩ nhiên phải tìm max1, max2 & max3 nữa mới đủ.

Hieu Hoang viết 14:34 ngày 01/10/2018

mình nghĩ chạy 2 lần vòng for, 1 để tìm ra max, 1 lần nữa để so sánh xem có tích 3 số nào = max thi in ra là xong

rogp10 viết 14:27 ngày 01/10/2018

Sao lại không in ra ngay mà phải chạy 1 for nữa?

Hieu Hoang viết 14:36 ngày 01/10/2018

vòng đầu đã biết max bằng bao nhiêu đâu mà in ra đc

hao vi viết 14:42 ngày 01/10/2018

Làm được rồi cảm ơn bạn nhiều

Bài liên quan
0