Saper of Eratosthenes를 사용하여 SPOJ의 PRIME1 문제를 해결하려고합니다. 코드는 아래의 정수에 대해 잘 작동하지만 오랫동안의 int에 대한 다음과 같은 오류 표시 -"액세스 위반"이 오류를 해결할 수 없습니다.
"spoj1.exe에서 0x770d15ee에서 처리되지 않은 예외 :.가 0xc0000005 : 액세스 위반 쓰기 위치 0x0014010c을"
문제를 해결하는 데 도움을주십시오. 또한 나는 코딩에 익숙하지 않기 때문에 내가 만든 모든 실수를 참아주십시오.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, test, i, k;
long int *arr, p;
scanf("%d", &test);
while (test--)
{
scanf("%d%d", &m, &n);
arr = (long int *)calloc(n - 1, sizeof(long int));
if (m == 1)
{
m = 2;
}
arr[0] = 2;
for (i = 1; i < n - 1; i++)
{
arr[i] = arr[i - 1] + 1;
// printf("%d\n",arr[i]);
}
for (i = 0; i < n - 1; i++)
{
if (arr[i] != 0)
{
for (k = arr[i] - 2; k < n - 1;)
{
k = k + arr[i];
arr[k] = 0;
}
}
}
for (i = 0; i < n - 1; i++)
{
if (arr[i] != 0 && arr[i] >= m)
{
printf("%d\n", arr[i]);
}
}
printf("\n");
}
free(arr);
return 0;
}
편집
예 -
여기 내 코드입니다. k = k + arr[i]
이 버그를 생성하고있었습니다. 고맙습니다. 하지만 여전히 큰 숫자에 대해서는 오류가 발생합니다. 예 - m = 100000000
및 n = 110000000
에 대해 코드가 제대로 실행되지만 m = 999899999
및 n = 999999999
에 대해 다음 오류가 표시됩니다. 오류는 - "spoj1.exe의 0x778a15ee에서 처리되지 않은 예외 : 0xC0000005 : 0x00000000 위치에 액세스 위반이 발생했습니다." 변경된 코드는 -이 코드 블록에서
for(k = arr[i]-2; k<n-1;)
{
k = k + arr[i];
if(k < n-1)
{
arr[k] = 0;
}
'calloc()'에'k = k + arr [i];' – Himanshu
이라는 줄이 있는데,'n <= 1'이면 어떻게 될까요? 또한, 성공을 확인 했습니까? –
디버거에서 코드를 실행하십시오. –