다음은 아래 코드입니다 (CP qs에 해당)
실행 시간 제한은 6 초이지만 내 코드가 더 느립니다.
더 많은 메모리와 시간을 효율적으로 만들 수있는 방법은 무엇입니까?
입력 : 입력은 한 줄의 테스트 케이스 수 t 로 시작 합니다 ( t <= 10 ).
다음 t 줄 각각 에는 공백으로 구분 된 두 개의 숫자 m 과 n ( 1 <= m <= n <= 1000000000 , nm <= 100000 )이 있습니다.
출력 : 모든 테스트 케이스에 대해 m <= p <= n , 한 줄에 하나의 숫자, 빈 줄로 구분 된 테스트 케이스가 되도록 모든 소수 p를 인쇄합니다 .
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long int t,m,n,i,j,k;
//printf("Enter number of testcases:\n");
scanf("%ld",&t);
long int test[t][2];
for(i=0;i<t;i++){
//printf("Enter m,n:\n");
scanf("%ld %ld",&test[i][0],&test[i][1]);
}
for(k=0;k<t;k++){
for(i=test[k][0];i<=test[k][1];i++){
for(j=2;j*j<i*i;j++){
if(i%j==0)
break;
}
if(j==i){
printf("%ld\n",i);
}
}
printf("\n");
}
return 0;
}
Eratosthenes의 오프셋 체를 사용하십시오 ( 이 답변 참조 , 의사 코드, 두 링크 모두 저에 의한 SO 답변에 대한 것입니다).
입력에 따라 하나의 세그먼트에서만 작동하도록 수정 된 에라토스테네스 의 세그먼트 화 된 체입니다.
차이는이 점이다 분단 현재 (최대 체로되는 세그먼트에 의해 필요에 따라 소수의 많은 같은 불명확 세그먼트 사용하여 진행 자체 는 상부 한계의 제곱근); 여기에서 최상위 세그먼트의 한계 (따라서 핵심 세그먼트의 한계)가 사전에 알려져 있습니다.
핵심 세그먼트는 sqrt
고려할 가장 큰 가치 까지 확장 됩니다. 여기에서는 10^9
. sqrt(10^9) < 32000
, 따라서 코어 세그먼트는 0에서 32000에 걸쳐 있으며 간단한 에라토스테네스 체로 걸러집니다.
여러 번 실행되었으므로 각 실행에 동일한 코어를 사용하십시오.
연결된 답변의 코드는이 질문의 요구 사항에 맞게 쉽게 수정할 수 있습니다. top
값 을 추정하는 대신 입력에 제공된를 사용하십시오 n
. 여기 above
에서 부르는 m
것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다