Chạy code bị lỗi 3221225725

anh
Thì đề bài là như vầy có cả thuật toán rồi cơ mà khi nhập n = 1 triệu (max n) thì số phần tử của mảng p là n+1 thì khi chạy nó chỉ hiện ra return 3221225725 rồi kết thúc mà ko chạy chương trình dù code ở phía sau đúng.
mọi người giúp e sửa lại với cái này là do bị tràn vì quá nhiều phần tử trong mảng hay sao ạ

Code của bạn đâu rồi?

2 Likes

Gạch 1 ý là dùng sàng đấy :smiley: nói chung vẫn phải xem code ntn.

3 Likes

Đây bạn ơi.

#include <stdio.h>
int songuyento(long n){
	long i=2;
	if((n == 1) || (n == 0))
		return 0;
	for(; i<= n/2; i++)
		if(n%i == 0)
			return 0;
	return 1;
}
void ktsonguyento(long n, int p[]){
	long i;
	for (i = 1; i <= n; i++)
		if(songuyento(i))
			p[i] = 0;
		else 
			p[i] = 1;	
}
int docao(long i){
	if (i == 0)
		return 0;
	return i%10 + docao(i/10);
}
int main(){
	long n;
	int h;
	printf("Moi nhap so tu nhien n (10 <= n <= 1000000): ");
	scanf("%ld", &n);
	while ((n<10) || (n>1000000)){
		printf("Moi nhap lai so nguyen n (10 <= n <= 1000000): ");
		scanf("%ld", &n);
	}
	int p[n+1];
	printf("Moi nhap do cao h (1 <= h <= 54): ");
	scanf("%d", &h);
	while ((h<1) || (h>54)){
		printf("Moi nhap lai do cao h (1 <= h <= 54): ");
		scanf("%d", &h);
	}
	ktsonguyento(n, p);
	long i, dem = 0;
	for (i = 1; i <= n; i++){
		if (p[i] != 0)
			continue;
		if (dem > 0)
			dem++;
		if( (h == docao(i))){
			dem++;
			if(dem == 1)
				printf("Day so nguyen to co do cao %d khong vuot qua %ld la\n", h, n);
			printf("%ld\n", i);
		}
	}
	if (dem == 0)
		printf("Khong co so nguyen to nao vuot qua %ld co do cao %d", n, h);
	return 0;
}

Không biết bạn đã chạy code của bạn chưa, mình chạy code của bạn với input 999999 53 bị chạy quá lâu. Có lẽ là ở đâu đó có vòng lặp vô hạn.

Bạn bỏ hết tất cả các dòng mời nhập với mời nhập lại đi. Giả sử người nhập luôn nhập đúng theo giới hạn đã.

2 Likes

Số quá lớn tầm hơn 100000 thì nó lâu với lại mình đang khó hiểu yêu cầu đề bài là dùng mảng p[i] trong khi có thể so sánh trực tiếp

mình nghĩ chỗ số nguyên tố sửa n/2 thành sqrt((float)n) có lẽ sẽ nhanh hơn nhiều ạ.

Bạn nên cấp phát động cho mảng p thay vì khai báo int p[n+1] trong hàm main(), bạn khai báo mảng p như vậy là khai báo biến trên stack, mà bộ nhớ stack không chịu được mảng 1 triệu phần tử số.

Rõ ràng \sqrt{n} < n / 2, vòng lặp sẽ nhanh hơn, nhưng với limit n \le 10^6 thì bạn cần nghĩ đến code sàng nguyên tố.

2 Likes

Bạn có thể chỉ mình cách cấp phát động danh sách đặc p được không ạ mình chưa học @@

Bài 8: Cấp phát động Link dự phòng

2 Likes

Gợi ý muốn nói là bạn dùng sàng Eratosthenes (vì sao có slot bằng 0 hay 1) chứ chạy kiểu bạn nó treo cũng ko oan :slight_smile:

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