Code liệt kê các phần tử trong mảng có ít nhất 2 phần tử khác lớn hơn nó bị sai

Bài làm:

#include<stdio.h>
int main(){
	int n,a[n];
	scanf ("%d",&n);
	for(int i=0;i<n;i++){
		scanf ("%d",&a[i]);
	}
	int max=a[0],max2=a[0];
	for(int i=1;i<n;i++){
		if(a[i]>max) {
		max=a[i];
		max2=max;
		}
		else if(a[i]>max2){
			max2=a[i];
			}
	}
	for(int i=0;i<n;i++){
		if (a[i]<max2) printf ("%d ",a[i]);
	}
	return 0;
}

Có gì không ổn đấy! :smirk:

2 Likes

b edit giúp mk bài này giúp mk vs

? mọi bài mk đều đăng tnay mà?

Chạy tay thử 2 dòng gán xem ra gì?

Bài này sai 3 chỗ:

  • 1: Khởi tạo max = max2 = a[0] :smiley: (như [3 2 1])
  • 2: Vậy nếu max == a[i] thì sao?
  • 3: Như trên.

Ta có thể thiết lập điều kiện cho mỗi bước lặp như sau:

  • Pre:
    • ++i < n
    • max >= max2
  • Post:
    • max >= max2 >= a[i]
    • max == ::max(max, a[i])

Thật ra nếu ta thay max bằng a[max_index] và max2 bằng a[max2_index] thì điều kiện mới chặt chẽ (max và max2 phải có mặt trong a). max2_index còn phải thỏa không có index nào ngoài max_index mà a[index] > a[max2_index] được, nhưng do a[i] <= a[max2_index] (post_1) nên đây mới là điều kiện cần và đủ ■

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