30/09/2018, 22:29

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;
}
*grab popcorn* viết 00:33 ngày 01/10/2018

Cách này có hay hơn ko nè.
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.

Duc Nguyen viết 00:42 ngày 01/10/2018

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

Duc Nguyen viết 00:40 ngày 01/10/2018

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

*grab popcorn* viết 00:35 ngày 01/10/2018

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

Duc Nguyen viết 00:44 ngày 01/10/2018

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

Duc Nguyen viết 00:45 ngày 01/10/2018

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

rogp10 viết 00:32 ngày 01/10/2018

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.

Trần Hoàn viết 00:33 ngày 01/10/2018

-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
rogp10 viết 00:42 ngày 01/10/2018

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

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

guo_da viết 00:44 ngày 01/10/2018

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
Nguyen Trong Dung viết 00:38 ngày 01/10/2018

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.

Bài liên quan
0