2016-10-06 9 views
7

私はオンラインで小さなプログラミングコンテストに参加しています。基本的に私がやることは、タスクを解決し、アルゴリズムを書いて、自分のコードを送信して競争相手のサーバーによって自動的に評価されることです。C++印刷はC言語よりも非常に高速です

サーバーでは、さまざまなプログラミング言語を使用できます。すべてのタスクは、基本的に、プログラムが端末から入力を受け取り、正しいものを端末に出力することを要求する。だから競争相手のウェブサイトで私は彼らがサポートする言語の1つがC++であり、g ++を使ってそれをコンパイルすることに気付きました。さて、私はC言語に堪能ではないので、C言語で答えを返すと思った。

これは最初の作業にはうまくいきました。しかし、私は常に、プログラムの実行時間のために設定された制限をヒット2番目のタスク(2秒)

にこれは私のCコードです:

#include <inttypes.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 
#include <stdlib.h> 

uint8_t get_bit(uint64_t k) { 
    ... 
} 

int main(int argc, char *argv[]) { 
    uint64_t n; 
    uint64_t k; 
    scanf("%u", &n); 

    uint64_t i; 
    for (i = 0; i < n; i++) { 
     scanf("%u", &k); 
     printf("%d\n", get_bit(k)); 
    } 

    return 0; 
} 

だから私のアルゴリズムは、で定義されています。 サーバーは私のプログラムで3つの異なるテストを実行しますが、プログラムの実行時間を長くするために値が大きくなります。

ただし、このコードは実行に2秒以上かかるため、テストに失敗しました。無駄な時間のために別のソリューションを試して、私は最終的に少し異なる印刷方法で私のコードをC + +として提出しようとしました。ここで

は私のC++のメイン(プログラムの残りの部分はほとんど同じ滞在)である:

int main(int argc, char *argv[]) { 
    uint64_t n; 
    uint64_t k; 
    cin >> n; 

    uint64_t i; 
    for (i = 0; i < n; i++) { 
     cin >> k; 
     cout.operator<<(get_bit(k)) << endl; 
    } 

    return 0; 
} 

そして、私はこのコードを提出する際、すべてのテストは、わずか数百ミリ秒ごとに完璧に走りました。 でアルゴリズムを変更せず、印刷のみを変更したことに注意してください。

なぜCで印刷するのがCよりもずっと速いのですか? (私の場合、最大10倍速く) 可能であれば、どのようにCでこれらの速度を達成できますか?おそらく気付いているように、私はC++に堪能ではなく、前のコードは主にコピー貼りです。このような理由から、私はC言語での方がむしろ好きです。

ありがとうございます。

+0

入力はどのくらいですか? –

+2

'scanf("%u "、&n);は' n 'を完全に初期化していない可能性が高いので、forループはおそらく異なる回数実行されます。プログラムをローカルで実行して、 Cプログラムのより多くの出力行を実行するには? –

+0

あなたのコンパイラは '' uint64_t'で ''%u "'を使用することに関する警告を表示する必要があります警告フラグをオンにしてください – DeiDei

答えて

6

あなたのコードである可能性があります(コメントを参照)が間違っている可能性があります。 %uscanfと64ビット整数で使用することはできません。

ここで3番目の表を確認してくださいhttp://www.cplusplus.com/reference/cstdio/scanf/%lluのようにsthを使用する必要があります。

+1

'unsigned int'が64ビットであれば可能ですが、おそらくそうではありません。 –

+0

@KeithThompson良い点。 – ciechowoj

+4

これは 'scanf()'によって 'n 'の下位部分が設定され、上部がいくらか(一見無作為に)ランダムな値になり、遠すぎるループ反復を引き起こす可能性があります(またはその逆)。 – Dmitri

関連する問題