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.
Bài liên quan
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 đủ.
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
Sao lại không in ra ngay mà phải chạy 1 for nữa?
vòng đầu đã biết max bằng bao nhiêu đâu mà in ra đc
Làm được rồi cảm ơn bạn nhiều