Xin ý tưởng bài tìm số nguyên chẵn lớn nhất nhưng nhỏ hơi mọi giá trị lẻ

Anh/chi giup đỡ bài tập này em đang làm được một nửa rồi nhưng hết ý tưởng đây là bài tập khó của thầy nguyễn tấn trần minh khang
đề cho mảng một chiều các số nguyên hãy viết hàm tìm giá trị chẵn lớn nhất nhỏ hơn mọi giá trị lẻ có trong mảng:

#include<iostream>
#define max 100
using namespace std;
void nhapmang(int &n,int a[max])
{
	cout<<"nhap so luong phan tu mang:";cin>>n;
	for(int i=0;i<n;i++)
	{
		cout<<"a["<<i<<"]:";cin>>a[i];
	}
}
int kiemtrachan(int n)
{
	if(n%2!=0)
	{
		return 0;
	}
	return 1;
}
int kiemtrale(int n)
{
	if(n%2==0)
	{
		return 0;
	}
	return 1;
}
int xuly(int n,int a[max],int &chan2)
{
	int chan,le;
	int i,dem=0,dem2=0,vitri;
	for(int i=0;i<n;i++)
	{
		if(kiemtrachan(a[i])==1)
		{
			chan=a[i];
			dem++
			break;
		}
	}
	for(i=0;i<n;i++)
	{
		if(kiemtrale(a[i])==1)
		{
			dem2++;
			le=a[i];             // tim le bat ky o trong mang
			break;
		}
	}
	if (dem2==0||dem==0)
	{
		return 0;
	}
	for(i=0;i<n;i++)
	{
		if(kiemtrale(a[i])==1)
		{
			le=(a[i]<le?a[i]:le); // tim min le 
		}
	}
	for(i=0;i<n;i++)
	{
		if(kiemtrachan(a[i])==1)
		{
			chan=(a[i]>chan)?a[i]:chan; //tim max chan
		}
		if(chan<le)
		{
			chan2=a[i];
		}
	}
	return chan2;
}
int main()
{
	int n,a[max],chan2;
	nhapmang(n,a);
	xuly(n,a,chan2);
	int x=xuly(n,a,chan2);
	cout<<"  "<<x;
}

Cách này có hay hơn ko nè. :grin:
Sort mảng tăng dần.
Tìm max số chẵn như bình thường và dừng khi gặp số lẻ đầu tiên.

4 Likes

theo mình không phải tìm lẻ đầu tiên ,mà tìm min lẻ ,cũng không phải max chẵn mà tùy trường hợp ví dụ như mảng a: 4 8 7 5 thỏa yêu cầu là 4 chứ không phải là 8 như bạn nói tìm max chẵn

cám ơn bạn nhiếu ý tưởng bạn rất hay

Bạn sort lại thì số lẻ đầu tiên chính là min lẻ đó bạn.

1 Like

cám ơn bạn nhiều:heart_eyes:

bạn cho minh xin facebook của bạn làm quen có gì trao đổi trong học tập

Chạy hai vòng: tìm min lẻ (hàm này chắc bạn viết rồi) rồi vòng lại tìm tiếp. Bài này nên dùng sentinel cho cả hai vòng.

-Tạo int MaxChẵn = NULL; int MinLẻ=NULL;
-Nếu mảng A không có phần tử nào thì chửi sml thằng nhập số.
-Nếu A[0] là số chẵn, MaxChẵn = A[0] không thì MinLẻ = A[0];
-Cho chạy vòng for lần 1 để tìm Min lẻ:

  1. Nếu MinLẻ bằng NULL thì tìm max các số chẵn.
  2. Nếu MinLẻ != NULL thì tìm max các số chẵn nhỏ hơn MinLẻ. Nếu max chẵn lại bằng NULL thì tức là mảng không có số chẵn

@all: cái này là pseudocode :slight_smile:

Với lại chỉ cần A[0] < MinLe là kq sai rồi.

theo mình thì:

  • tìm min lẻ.
  • duyệt mảng tìm chẵn đầu tiên nhỏ hơn min lẻ -> gán làm max chẵn. break;
  • duyệt mảng: tìm max chẵn. điều kiện: nhỏ hơn min lẻ, lớn hơn max chẵn.
    return

Theo mình thì nên kiểm tra chan < le k trước.
Tức a[i] là nếu là chẵn, a[i] <minle, thì duyệt tiếp xem a[i] đó có lớn hơn chẵn không.

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