Xóa tất cả số nguyên tố có trong mảng

vd như khi em nhập 3 5 7 9 , thì nó chỉ xoá 3 và 7 , giữ lại 5 và 9

#include<stdio.h>
int snt(int n)
{
	int d=0;
	for(int i=1;i<=n;i++)
	{
		if(n%i==0)
			d=d+1;
	}
	if(d==2)
		return 1;
	else return 0;
}
void xoamang(int n,int x,int A[])
{
	
	for(int i=x;i<n;i++)
	{
		A[i]=A[i+1];
	}
	n=n-1;
	
}
void main()
{
	int n,A[100],i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&A[i]);
	for(i=0;i<n;i++)
	{
		if(snt(A[i])==1)
		{
			xoamang(n,i,A);
			
		}
		n=n-1;
	}
	for(i=0;i<n;i++)
		printf("%d ",A[i]);
}

5? :smiley:

Khi xóa xong thì bạn còn thiếu một bước :slight_smile: Thực ra để dễ xóa (hàng loạt nhé) thì có thể ghi đè mảng lên chính nó. (phải suy nghĩ “out of the box” chút)

2 Likes

Hình như đây là bài toán dính đến sàng Eratosthenes. Nếu đúng, cứ cầm cây ra mà chọc :smiley:

Không phải :smiley: Sàng Eratosthenes chạy từ M đến N mà.

Dạng này là xét và lọc (số) thôi.

1 Like

Thế thì khả năng cái mảng sau khi lọc sẽ là tập con của cái sàng Eratosthenes?

Không :smiley: lọc lại chỉ còn hợp số thôi.

1 Like
for(i=0;i<n;)
{
if(snt(A[i])==1)
{
xoamang(n,i,A);
continue;
}
n=n-1;
i++
}

Các hàm snt, xoamang là tạm ổn
Vấn đề xảy ra ở vòng for khi xóa số nguyên tố:

Giả sử ta có mảng theo trật tự sau

[... ,(i) snt,(i+1) snt, ...]

Khi đó hàm xóa mảng sẽ dồn snt(i+1) lên vị trí ở ô i. Nhưng khi đó vòng for đã nhảy lên ô i+1 nên số này không bị xóa.

Khi xóa mảng thì n mới bị giảm.

for(i=0;i<n;i++)
	{
		if(snt(A[i])==1)
		{
			xoamang(n,i,A);
			n=n-1;
                        i--;
		}
		
	}
2 Likes

e cám ơn các anh nhìu lắm ạ :sweat_smile::sweat_smile:

cảm ơn anh nhiều ạ, em thiếu i-- hèn gì ko dc <3

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