2013-07-11 1 views
1

나는 프로그래밍 콘테스트 시스템에서 몇 가지 문제를 해결하려고 노력하고 있으며, 2 포인트 거리 문제를 해결하고 있는데, 왜 내 코드가 모든 제출물의 1181º에 순위가 매겨 졌는지 이해할 수 없습니다.어떻게이 C 코드를 다른 것보다 빨리 얻을 수 있습니까?

어떻게 코드를 빠르게 처리 할 수 ​​있습니까?

#include <stdio.h> 
#include <math.h> 

int main(){ 
    register unsigned int x1,x2,y1,y2; 
    scanf("%i %i %i %i", &x1,&y1,&x2,&y2); 
    printf("%.4f", sqrt(pow(x2-x1,2) + pow(y2-y1, 2))); 
} 
+0

변수를 레지스터에 넣는 것이 그렇게 빠른 것은 아닙니다. 반면에 수학 함수는 매우 느립니다. 그리고'% u'를 사용하여'unsigned int'를 검사하십시오. – Kninnug

+1

[빠른 근사 거리 함수] (http://www.flipcode.com/archives/Fast_Approximate_Distance_Functions.shtml) –

+0

우선, 당신은 아마도'scanf'를 없애고 싶을 것입니다. 그런 다음 수학 함수도 제거하십시오. 그런 다음 [빠른 근사 공식] (http://mathforum.org/kb/thread.jspa?threadID=48233&messageID=170470)을 사용하십시오. –

답변

0

당신은 몇 가지 중복 함수 호출을 제거하고 또한> 부동 소수점 변환을 INT-피 얻을 수 있습니다

#include <stdio.h> 
#include <math.h> 

int main(){ 
    double x1,x2,y1,y2; 
    scanf("%lf %lf %lf %lf", &x1,&y1,&x2,&y2); 
    printf("%.4f\n", sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))); 
    return 0; 
} 
5

당신이 pow()을 사용하지 않는 경우뿐만 아니라, 당신은 당신이 경우 불필요 함수 호출을 피할 수있다 (x2-x1) 자체를 곱하면 (최적화되지 않을 수도 있습니다 - 잘 모르겠습니다), 하나만있을 때까지 부동 소수점 값으로 캐스팅을 지연 할 수 있습니다 (sqrt()).

실제 문제가 단 한 줄 이상의 입력을 읽는 경우 (예를 들어 정수 읽기로 가정하면) 성능면에서 가장 큰 차이점은 잘 작성된 사용자 정의 함수에 유리하게 scanf() 일 것입니다. 예를 들어 fread()stdin에서 사용합니다.

+0

+1 - ** scanf() 호출을 제거하기위한 ** 많은 이유가 ** 있습니다. 속도는 하나뿐입니다. 내가 작동하는 곳에서 실행 시간 현명한 스트림 IO> scanf> itoa (우리는 정수를 사용했지만, 관계가 같다고 생각합니다)를 테스트 한 결과를 발견했습니다. 경쟁 환경 밖에서도 scanf는 오류를 범하기 쉬운 전환 방법입니다. 논쟁의 여지가 있지만 읽기가 더 어렵습니다. –

관련 문제