01/10/2018, 12:04

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 ạ!!

HK boy viết 14:14 ngày 01/10/2018

SIGSEGV là gì:

en.wikipedia.org

Segmentation fault

In computing, a segmentation fault (often shortened to segfault) or access violation is a fault, or failure condition, raised by hardware with memory protection, notifying an operating system (OS) the software has attempted to access a restricted area of memory (a memory access violation). On standard x86 computers, this is a form of general protection fault. The OS kernel will, in response, usually perform some corrective action, generally passing the fault on to the offending process by sending...

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á.

Gió viết 14:08 ngày 01/10/2018

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

Ngọc Bùi viết 14:05 ngày 01/10/2018

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 ạ :(((

Ngọc Bùi viết 14:09 ngày 01/10/2018

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

HK boy viết 14:07 ngày 01/10/2018

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ử.

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

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 ạ :(((

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

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

Bài liên quan
0