2016-11-30 18 views
-2

私は、サイトopen.kattis.comからhttps://open.kattis.com/problems/differentより効率的なCPPコード

で問題を解決しようとしている問題は、0から10^15への2つの非負整数に取ると、あなたは違いを計算しています。私はこれを書いて、それを正しく計算しますが、それは十分に速くはありません。どうすれば速くすることができますか?より多くの時間を要する

#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;baよりも大きい場合は[はいあなたは終わるだろう否定的な結果をもたらす。その場合は、-1を掛けます。私は主にC言語で作業しますが、C++では次のようになります。まず、計算結果を変数 'x' long long int x = a-bに格納してからif (x < 0) { x *= -1 ;}に格納します。私のコードが正しい場合、これはうまくいくはずです。私はそれがはるかに速くなるか分からないが、それは間違いなく試してみる価値がある。

EDIT:または、@ user64322のように、上記と同じことができますが、-1で乗算するのではなく、絶対値を取るだけですが、同じですが速くなります。

+1

私はこれが完全にフラッシュされていないと確信しています。 –

2

最後に '\ n'が追加されている間にストリームがフラッシュされるため、実際に多くの回数実行された場合の実際のパフォーマンスヒットは実際には 'endl'から来ます。他のマイクロ最適化は無意味ですが、私はコンパイラが十分に速く十分なコードを置くことができるほどスマートだと確信しています。

編集:潜在的なパフォーマンス向上のために本当に必要な場合は、std::ios::sync_with_stdio(false);を追加することもできます。これにより、Cスタイルストリーム間の同期が防止されます。参照:他人の提案に加えてsync

0

を、あなたが行うことができます明白なことではなく、ユーザーの入力を待っている間に実行をブロックする(例えば./PrintDiffQuick 10 55を印刷します)起動時にコマンドライン引数を取るようにargvを使用しています。

#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; 
} 
関連する問題