2014-12-06 98 views
0

我在一個網絡編程c中註冊了幾個算法練習。 我做了一個很簡單的問題如下: 我收到4個數字,確定一個矩形的2個角的座標,並且必須計算面積。 有一組測試,當第二個角落在第一個(x1> x2 || y1> y2)的左下方時,程序退出。 enter image description here優化c中的數學運算

例:

輸入:

1 1 4 3 
0 0 1 1 
9 7 3 6 //Exit 

輸出:

6 
1 

這是我的代碼。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    while(1) { 
     int x1, x2, y1, y2; 
     scanf("%d %d %d %d", &x1, &y1, &x2, &y2);//x1 y1 == A, x2 y2 == B 
     if(x1 > x2 || y1 > y2) 
      return 0; 
     printf("%d\n", (x2 - x1) * (y2 - y1)); 
    } 
} 

我的問題只是一個好奇心。我用「0052」的時間解決了這個問題,在我面前有3個人在「0048」和「0024」中設法解決! 我可以使用什麼optimisazion方法來縮短時間?可能是指針?

+1

'scanf'和'printf'(每次刷新都會)比其他任何東西都慢(*多*)。 – 2014-12-06 22:58:39

+0

定時等待鍵盤輸入的函數是無稽之談。你正在爲打字員計時。 – 2014-12-07 09:08:04

回答

2

的幾點思考:

  1. 你可以使用gcc的__builtin_expect()功能,以確保該條件被認爲是假的。

  2. 指針不太可能幫助您改進解決方案。

  3. scanf()可能是真的很慢的部分。用一個只有預期的十進制整數的解析器重寫這個可能會快得多。目前,scanf()需要解析格式字符串,並且輸入數字可以是八進制,十六進制或十進制。或者可能是無效輸入。等等。

+0

我應該如何在我的程序中使用__builtin_expect()?我從來沒有使用它,我不知道如何應用它。 – Raxkin 2014-12-06 22:55:16

+0

@Raxkin:我通常通過助手宏'很可能(x)'和'不太可能(x)'來使用它們:http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-內核 – 2014-12-06 23:47:08

+0

這個問題是一個完整的廢話。它是計時器的標準I/O語句,程序員無法控制。 (其他陳述的時間 - 縮減兩個基本的C表達式,沒有什麼可以優化 - 相比之下,可笑的是很小)。 – 2014-12-07 09:12:47

0

不多,但也許嘗試在進入循環之前聲明int x1, x2, y1, y2;

+0

我嘗試過,但是當我做到這一點時,我得到的時間比我的最佳時間006更多 – Raxkin 2014-12-06 22:49:55

+0

您可能會發現生成的機器碼相同。看看機器代碼(特別是編譯器試圖優化)除了擔心無單位的四位數時間數字之外沒有任何損害。 (意見:即使在微觀基準測試中,也不要擔心時間低於5秒鐘,做時間限制的基準測試,而不是循環計數。) – greybeard 2014-12-07 10:23:03

0
here are my suggestions: 
1) in the compile statement use: 
    gcc -O3 
2) place all working variables in global space rather than stack space 

int x1, x2, y1, y2;, area 
char buffer[100]; 
int main() 
{ 
    do 
    { 
     fgets(buffer, sizeof(buffer), stdin); 
     sprintf(buffer, "%d %d %d %d", &x1, &y1, &x2, &y2); 
     x2-=x1; 
     y2-=y1; 
     area = y2*x2; 
     printf("%d\n",area); // or perhaps puts(itoa(area)); 
    } while((0 <= x2) && (0 <= y2) 
    return(0); 
} 
+0

這是一個在線競賽,你不需要編譯你自己的代碼並提交二進制 – smac89 2014-12-07 05:06:12

+0

這對我來說是什麼,我沒有提交任何二進制 – user3629249 2014-12-07 05:36:11

+0

你建議OP使用編譯器優化標誌。這就是爲什麼我說你在提交前不編譯你的代碼。在線裁判進行編譯和測試,您只需編寫代碼 – smac89 2014-12-07 05:38:16