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 ạ!!
Bài liên quan
SIGSEGV là gì:
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á.
Khi n= 109 thì i = sqrt(n) là bao nhiêu, từ đó tính ra kích thước mảng tối đa
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
Để không dư space thì ta dùng hai for liên tiếp.