2016-11-30 94 views
-2

我試圖從網站open.kattis.com https://open.kattis.com/problems/different更高效的CPP代碼

問題是你在兩個非負整數採取從0到10^15解決了問題,你計算差值。我寫了這個,它計算正確,但它不夠快,我怎麼能使它更快?

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() { 
    long long int a, b; 
    while(a != 0){ 
     cin >> a >> b; 
     if (a > b) { cout << a-b << endl;} 
     else{ cout << b-a << endl;} 
    } 
    return 0; 
} 
+5

'a'未初始化。 –

+0

而不是檢查條件,使用可以使用「abs(a-b)」 – Sniper

+1

擺脫'endl'可能會有所幫助。改用'「\ n」'替代。 –

回答

0

而不是做一個比較,看看哪個是更大的,這需要更多的時間,你可以忘掉這是更大的,反正計算差值:cout << a-b << ends;如果b大於a則是你最終會結果是負面的。在這種情況下,乘以-1。我主要用C語言工作,但我認爲在C++中,它看起來像這樣:首先將計算結果存儲在變量'x'long long int x = a-b,然後if (x < 0) { x *= -1 ;}。這應該工作,如果我的代碼是正確的;我不確定它會更快,但絕對值得一試。

編輯:或者像@ user64322說的,你可以像上面那樣做,但不是乘以-1,只取絕對值,這是相同的,但更快。

+1

我敢打賭,這完全是因爲'endl'的沖洗而黯然失色。 –

2

真正的性能擊中,如果跑了很多次,實際上會來自'endl',因爲儘管它在最後添加了'\ n',但它也會刷新流。任何其他的微型優化在最好的情況下都是毫無意義的,我相信編譯器足夠聰明,可以在其中放置足夠快的代碼。

編輯:也可以添加std::ios::sync_with_stdio(false);如果你真的絕望潛在的性能提高。這可以防止C風格流之間的同步。請參閱:sync

0

除了別人的建議,你可以做一個明顯的一點就是使用argv採取命令行參數在啓動時(例如./PrintDiffQuick 10 5將打印5)而不是阻塞執行,同時等待用戶輸入。

#include <cinttypes> 
#include <iostream> 

int main(int argc, const char **argv) 
{ 
     std::ios::sync_with_stdio(false); 
     std::cout << std::imaxabs(std::strtoimax(argv[1], nullptr, 10) - 
            std::strtoimax(argv[2], nullptr, 10)) << '\n'; 
     return 0; 
}