2013-07-11 129 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's。 – Kninnug

+1

[快速近似距離函數](http://www.flipcode.com/archives/Fast_Approximate_Distance_Functions.shtml) – 2013-07-11 18:16:21

+0

首先,您可能希望擺脫'scanf'。然後,擺脫數學函數。然後,使用[快速近似公式](http://mathforum.org/kb/thread.jspa?threadID=48233&messageID=170470)。 – 2013-07-11 18:17:11

回答

0

你可以擺脫一些多餘的函數調用,也避免內部 - >浮充轉換:

#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()而贊成寫得很好的自定義函數例如使用來自stdinfread()

+0

+1 - 擺脫scanf()調用的**有很多很好的理由。速度不過是其中之一。在我工作的地方,我們發現在測試執行時間明智的流IO> scanf> itoa(我們使用整數,但我懷疑關係是相同的)。在競爭環境之外,您還會發現scanf是進行轉換的最容易出錯的方式。閱讀也很難辯論。 –