Code kiểm tra trong 5 số có đúng 3 số giống nhau bị sai

Cả nhà giúp e bài này với a, e làm nhưng ko biết sai ở đâu
Đề bài đây ah:
Nhập vào năm số, kiểm tra xem trong 5 số này, có chỉ đúng 3 số giống nhau ko??
INPUT: Trên một dòng ghi 5 số nguyên a, b, c ,d, e. Các số nguyên này nằm trong khoảng [1,1000].
OUTPUT: In ra YES nếu chỉ có đúng 3 số giống nhau, in ra NO nếu ngược lại.

#include<bits/stdc++.h>
using namespace std;
int main()
{
	unsigned int a[5], i, j, dem=0;
	for(i=1;i<=5;i++)
	{
		cin >> a[i];
	}
	for(j=1;j<=5;j++)
	{
		for(i=1;i<=5;i++)
		{
			if(a[i]=a[j])
			{
				dem+=1;
			}
		}
	}
	if(dem==3)
		cout << "YES";
	else cout << "NO";
	return 0;
}
	for(j=1;j<=5;j++)
	{
		for(i=1;i<=5;i++)
		{
			if(a[i]=a[j])
			{
				dem+=1;
			}
		}
	}

Lỗi do 2 vòng for này. Vì ở vòng for 2, nó chạy lại từ 1 nên bạn chắc chắn sẽ có trường hợp i = j -> a[i] == a[j]
Từ đó dẫn tới việc đếm bị sai.

Ngoài ra dùng chung 1 biến dem, thì bạn ko biết được rằng số nào xuất hiện 3 lần. Mà cứ trùng nhau là đếm lên.

3 Likes

Hà Mã Tím đáng yêu không viết C, nhưng theo quan sát Hà Mã Tím đáng yêu thuật toán của bạn thiếu ở 2 chỗ:

  1. bạn phải reset dem về 0 sau mỗi 1 lượt so sánh
  2. khóa dem khi dem bằng 3

Sửa lại như sau:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	unsigned int a[5], i, j, dem=0;
	for(i=1;i<=5;i++)
	{
		cin >> a[i];
	}
	for(j=1;j<=5;j++)
	{
        dem = 0; //reset
	    for(i=1;i<=5;i++)
		{
		    if(a[i]==a[j])
			{
                if (dem == 3)
                {
                    //dem is locked
                } else {
		            dem+=1;
		        }
            }
	    }
	}
	if(dem==3)
		cout << "YES";
	else cout << "NO";
	return 0;
}
4 Likes

À, quào.
Mảng trong C bắt đầu từ 1 ? Khai báo 5 phần tử mà “lấn” luôn sang phần tử thứ 6 ( a[5] ).

#include<bits/stdc++.h>
using namespace std;
int main()
{
	unsigned int a[5], i, j, dem=0;
// 5 phần tử có chỉ số từ 0 - 4 (int < 5 = 4)
	for(i=0;i<5;i++) 
	{
		cin >> a[i];
	}
	for(j=0;j<5;j++)
	{
		dem = 0;
		for(i=0;i<5;i++)
		{
			if(a[i]==a[j])
			{
				dem+=1;
			}
		}
// 5 số mà đã có đúng 3 số giống nhau. 2 số còn lại không cần xét nữa. Linh hoạt.
		if(dem==3){
			break;
		}
	}
	if(dem==3)
		cout << "YES";
	else cout << "NO";
	return 0;
}

À, không ổn, đề yêu cầu chính xác 3 số giống nhau. Nếu các số sau giống nữa thì… :kissing_smiling_eyes:

6 Likes

Chà, bug bự nhất lại không ai thấy :crazy_face::crazy_face::crazy_face::crazy_face::crazy_face:

4 Likes

Code của bạn có vấn đề ở 2 chỗ:
Thứ nhất là chỗ vòng lặp của bạn:

for(j=1;j<=5;j++)
	{
		for(i=1;i<=5;i++)
		{
			if(a[i]=a[j])
			{
				dem+=1;

Thì chắc chắn sẽ có trường hợp i trùng j trong mảng a này (vd như a[1] = a[1]) thì dẫn đến code sai.
Cái thứ 2 là bạn dùng sai toán tử bạn xài = thì = có nghĩa là gán giá trị toán hạng bên phải cho toán hạng trái. Trong trường hợp này bạn nên xài ==.
Đây là code mình sửa lại bạn tham khảo:

#include"pch.h"
#include<iostream>  
using namespace std;  
int main()
{
	unsigned int a[5], i, j, dem = 0;
	for (i = 0; i < 5; i++)
	{
		cin >> a[i];
	}
	for (j = 0; j < 5; j++)
	{
		for (i = j+1 ; i < 4 ; i++)
		{
			if (a[j] == a[i])
			{
				dem += 1;
			}
		}
	}
	cout << " so dem la : \n "; 
	cout << dem; 
	if (dem == 3)
		cout << "YES";
	else cout << "NO";
	return 0;
}
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?