30/09/2018, 16:54

C/C++ - Nhập và kiểm tra dãy số nếu trùng thì yêu cầu nhập lại

Mọi người giúp mình giải bài này với…
Đề bài nguyên văn là:
Nhập một dãy số có n phần tử trong đó không cho phép nhập các số trùng nhau. Nếu nhập một số đã có thì yêu cầu nhập lại. Sau khi đủ n phần tử thì in dãy số đã nhập ra màn hình.

Ý tưởng của e là viết hàm kiểm tra sự tồn tại:

int find_index(int a[], int num_elements, int value){
   int i;
   for (i=0; i<num_elements; i++){
     if (a[i] == value){
        return(value); 
     }
   }
   return(-1);  
}

Sau đó dùng vòng lặp để nhập…
Nhưng ý tưởng là vậy nhưng lên code rắc rối quá, mọi người hướng dẫn e hướng làm với, cám ơn ạ !

Dũng Kon viết 18:56 ngày 30/09/2018

cái này cũng đơn giản thôi bạn chắc do bạn mới học lập trình nên tư duy chưa được vững lắm, mình đề xuất giải pháp theo ý tưởng của bạn luôn

#include <iostream>
using namespace std;

bool find_index(int a[], int num_elements, int value)
{
	int i;
	for(int i = 0; i < num_elements; i++)
	{
		if(a[i] == value)
		{
			return true;
		}
	}
	return false;
}

void nhap(int a[], int &num_elements)
{
	cout << "\nNhap vao so luong phan tu:  ";
	cin >> num_elements;
	int temp;
	for(int i = 0; i < num_elements; i++)
	{
		cout << "\nNhap phan tu thu " << i << " ";
		cin >> temp;
		if(find_index(a, i, temp) == true)
		{
			cout << "\nGia tri bi trung vui long nhap lai";
			i--;
		}
		else
		{
			a[i] = temp;
		}
	}

}

int main()
{
	int a[100];
	int n;
	nhap(a, n);
	return 0;
}
Minh Hoàng viết 19:05 ngày 30/09/2018

hướng dẫn sử dụng chức năng debug


find_index thì sẽ trả về có 0 hoặc 1, vì nó kiểm tra mà
cứ tách từng phần nhỏ ra thành từng hàm, xác định từng hàm sẽ gồm những input gì, sẽ return về gì.
mạnh dạn code nhé bạn

Hoang Vu viết 19:06 ngày 30/09/2018

E cám ơn nha
Đọc code của a xong thấy dễ quá mà tại sao lại ko nghĩ ra đc
E kiểm tra luôn điều kiện cho a[i], nhưng ko lùi lại 1 giá trị để yêu cầu nhập lại :’(

Hoan Sò viết 18:54 ngày 30/09/2018

Cho em Hỏi chút. Tại sao em cho return false vào trong vòng lặp for thì nó k chạy đến a[n-1] vậy!

Dũng Kon viết 19:06 ngày 30/09/2018

Bạn nói rõ hơn được không @Hoan_So

Hoan Sò viết 19:04 ngày 30/09/2018

Em muốn hỏi là chỗ bool là nếu em đặt else return false trong vòng lặp for thì nó k xét tới a[n-1]

Dũng Kon viết 19:07 ngày 30/09/2018

khi chúng ta return lập tức sẽ có giá trị được trả về và hàm dừng ngay, không phải tới a[n-1] đâu em, mà bất kì đâu nó cũng thoát ra hết

Hoan Sò viết 19:02 ngày 30/09/2018

#include
using namespace std;

bool find_index(int a[], int num_elements, int value)
{
int i;
for(int i = 0; i < num_elements; i++)
{
if(a[i] == value)
{
return true;
}
else return false;
}
}
ý em là thế. Nếu như a nói thì làm gì đúng điều kiện của dòng if để nó chạy được return true để mà thoát ra được. Nếu em cho return flase vào trong như thế ví dụ n=3 thì nó chỉ xét đến a[n-2] thôi chứ k xét đến a[n-1] nên a[n-2] và a[n-1] trùng nhau nó k bắt nhập lại.

Nguyễn Văn Hồng viết 19:07 ngày 30/09/2018

Như vậy độ phức tạp của thật toán quá cao, em muốn làm giảm độ phức tạp của thuật toán đi thì có cách nào không ạ…

HK boy viết 18:54 ngày 30/09/2018

Dùng cấu trúc dữ liệu: set, map. Độ phức tạp để kiểm tra xem 1 phần tử có nằm trong dãy không là O(log n), tổng độ phức tạp là O(n log n) và độ phức tạp không gian thêm O(n) nữa.

rogp10 viết 19:01 ngày 30/09/2018

unordered_map O(1) tức là hash đó mà.

Bài liên quan
0