Lỗi SIGSEGV khi code trên spoj

link đề: http://www.spoj.com/PTIT/problems/BCFACTOR/
em code bài trêm bằng C++, code của em như sau:

#include<iostream>
#include<math.h>
#include<conio.h>
using namespace std;
int a[100];
long n;
void tinh(int a[], int n){
	int x=n;
	for(int i=2; i<sqrt(x); i++)
		a[i]=0;
	for(int i=2; i<sqrt(x); i++){
		while(n%i==0){
			a[i]+=1;
			n=n/i;
		}
		if(n==1)
			break;
		}
	for(int i=2; i<sqrt(x); i++)
		if(a[i]!=0)
			cout << i << " " << a[i] << endl;
	if(n>1)
		cout << n << " 1";
}
int main(){
	cin >> n;
	tinh(a,n);
	return 0;
}

Khi submit báo lỗi.
Em có gg lỗi này nhưng chưa hiểu mấy.Các pro chỉ em cách sửa lỗi,lỗi này là như thế nào? tại sao em lại gặp lỗi đó ạ???
Em cảm ơn ạ!!

SIGSEGV là gì:

Về cơ bản là lỗi xảy ra khi truy cập ngoài mảng. Đọc thêm (Online Judge nào cũng giống nhau):

https://discuss.codechef.com/questions/7589/why-do-i-get-a-sigsegv

Lỗi của bạn xảy ra do bạn khai báo mảng a ít quá.

1 Like

Khi n= 109 thì i = sqrt(n) là bao nhiêu, từ đó tính ra kích thước mảng tối đa

2 Likes

Em nên sửa code thế nào bây giờ ạ. Em tăng kích thước mảng lên căn 10^9 thì báo lỗi NZEC ạ :(((

Em cho kích thước mảng lên thì bị lỗi NZEC ạ =((

Số các ước của n không vượt quá 10^9 đâu. Chỉ cần để 10000 là đủ rồi.

Với lại, mảng trong C++ chỉ có thể để đến ~5e6 là tối đa (hoặc do máy mình cùi, không thể để to hơn được). Những bài có giới hạn số N lớn (như 1e7, 1e8, 1e18,…) không bao giờ để mảng có N phần tử.

Thực ra bạn tiếp cận sai thôi, bài này rất đơn giản, không cần mảng :slight_smile:

Để không dư space thì ta dùng hai for liên tiếp.

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