01/10/2018, 17:16

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]);
}
rogp10 viết 19:20 ngày 01/10/2018

giữ lại 5

5?

Khi xóa xong thì bạn còn thiếu một bước 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)

Vô Thin viết 19:30 ngày 01/10/2018

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

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

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

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

Vô Thin viết 19:20 ngày 01/10/2018

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

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?

rogp10 viết 19:22 ngày 01/10/2018

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

KieuThinh viết 19:18 ngày 01/10/2018

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

Gió viết 19:28 ngày 01/10/2018

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--;
		}
		
	}
Xuan Hoang viết 19:29 ngày 01/10/2018

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

Bài liên quan
0