Chúng ta đã cùng nhau đi làm bài tập tìm số lớn nhất trong mảng rồi. Hôm nay Lập trình không khó sẽ cùng các bạn đi giải 1 bài tập tư duy hơn một chút: tìm số lớn thứ 2 trong mảng. Hi vọng bài tập này sẽ giúp bạn ôn luyện được nhiều về các kiến thức đã học, đặc biệt là hàm và thao tác với mảng 1 chiều trong C.
Bài tập tìm số lớn thứ 2 trong mảng
/*
Tìm số lớn thứ 2 ở trong mảng
*/
Trong bài hướng dẫn này, mình sẽ tiếp cận theo 2 hướng khác nhau. Cụ thể:
- C1. Sắp xếp mảng giảm dần => Số lớn thứ 2 là arr[1]
- C2. Tìm đồng thời số lớn nhất và số lớn thứ 2
Bạn làm theo cách 1 sẽ dễ hiểu hơn, và nó cũng thuận với suy nghĩ của chúng ta hơn. Nhưng nếu làm cách 2 sẽ giúp thuật toán của chúng ta tối ưu hơn rất nhiều. Chúng ta sẽ đi qua từng cách nhé.
Chi tiết hướng dẫn từng cách có trong video hướng dẫn sau đây:
[wpcc-iframe loading=”lazy” title=”Bài 51. Tìm số lớn thứ 2 trong mảng” width=”720″ height=”405″ src=”https://www.youtube.com/embed/TS7CYGFLRk8?list=PLh91SaQgRYnpj1GqVmVMq4acSAHtSKKwR” frameborder=”0″ allow=”accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share” allowfullscreen]
Code tìm số lớn thứ 2 trong mảng
#include <stdio.h> /* Tìm số lớn thứ 2 ở trong mảng */ #define MAX_SIZE 100 // sức chứa tối đa void NhapMang(int arr[], int n){ for(int i = 0; i < n; i++){ printf("Nhap arr[%d] = ", i); scanf("%d", &arr[i]); } } void XuatMang(int arr[], int n){ for(int i = 0; i < n; i++){ printf("narr[%d] = %d", i, arr[i]); } } /* C1. Sắp xếp mảng giảm dần => Số lớn thứ 2 là arr[1] C2. Tìm đồng thời số lớn nhất và số lớn thứ 2 */ /*-------------------------*/ /* C1. */ void swap(int &a, int &b){ int tg = a; a = b; b = tg; } void SapXep(int a[], int n){ for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ if(a[i] < a[j]){ swap(a[i], a[j]); } } } } int FindBySort(int a[], int n){ SapXep(a, n); return a[1]; } /*-------------------------*/ /* C2. - Nếu có 1 số >= firstMax: secondMax = firstMax; firstMax = số lớn nhất mới tìm được - Nếu có 1 số chỉ > secondMax: secondMax = số lớn hơn mới tìm được */ int FindByLoop(int a[], int n){ int firstMax, secondMax; if (a[0] > a[1]){ firstMax = a[0]; secondMax = a[1]; }else{ firstMax = a[1]; secondMax = a[0]; } for(int i = 2; i < n; i++){ if(a[i] >= firstMax){ secondMax = firstMax; firstMax = a[i]; }else if (a[i] > secondMax){ secondMax = a[i]; } } return secondMax; } int main(){ int arr[MAX_SIZE]; int n; // số lượng phần tử của mảng // Kiểm tra số lượng phần tử là số dương + nhỏ hơn MAX_SIZE do{ printf("Nhap n = "); scanf("%d", &n); }while(n <= 1 || n > MAX_SIZE); // Nhập mảng NhapMang(arr, n); // Xuất mảng XuatMang(arr, n); printf("nSo lon thu 2 la %d", FindBySort(arr, n)); printf("nSo lon thu 2 la %d", FindByLoop(arr, n)); }
Kết quả chạy chương trình:
PS G:c_courcesday_51> .SoLonThu2.exe Nhap n = 5 Nhap arr[0] = 1 Nhap arr[1] = 3 Nhap arr[2] = 2 Nhap arr[3] = 4 Nhap arr[4] = 5 arr[0] = 1 arr[1] = 3 arr[2] = 2 arr[3] = 4 arr[4] = 5 So lon thu 2 la 4 So lon thu 2 la 4
Theo dõi lập trình không khó tại:
Để lại một bình luận