2017-01-07 9 views
-2

問題:標準入力ストリームでは、diapason [0、31]からの一連の数値のシーケンスが得られます。すべてのセットは-1で終了しました。すべてのセットは空でもよく、数字はセットで繰り返されてもよい。 すべての集合のXORを求め、結果の16進表現を出力する必要があります。つまり、{1,2,3}、{3,4}、{1,5}を得て、結果は{2,4,5}したがって、16進表現は34です。結果セットの各数値は、32ビットの16進表現のビットに対応します。コードの実行時エラー

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

int main() { 
    int32_t currentNum; 
    uint32_t num = 0, result = 0; 

    while (scanf("%"SCNd32, &currentNum) == 1) { 
     if (currentNum != -1) { 
      num |= 1 << currentNum; 
     } else { 
      result ^= num; 
      num = 0; 
     } 
    } 
    printf("%x\n", result); 
    return 0; 
} 

この問題は単純で、私の解決策は上記です。しかし、私は問題に従っている:コードを送信するテストシステムは私にランタイムエラーを返します。私は間違いがどこにあるのか分からず、ランタイムエラーを返すようなテストを思いつくことができません。 私に何かヒントを教えてください。

+0

セット内の繰り返しでテストしましたか? – Beta

+0

@Beta、もちろん、もちろん! –

+0

そして?あなたの最も簡単なテストは何ですか?また、あなたは裁判官と同じ結果を期待していますか?サイトは、望ましい結果をもたらしたそのような例を与えましたか? – Beta

答えて

0

まず、1 << 31は未定義の動作です。 1signed constantであり、1 << 31はで表現できないので、undefinedである。そこに1U << currentNumを試して、それを符号なしに定義してください。

第2に、SCNd32が期待どおりにならない場合があります。私のシステム(Windows上のMinGW-w64 GCC 5.3.0)では、それはまったく定義されていないので、あなたのプログラムはコンパイルされません。したがって、他の何かを意味すると定義され、コンパイルされても実行時には失敗することが想像できます。単純な"%d"または"%i"をお試しください。

第3に、実行時に呼び出した後に終了することによって、特定の関数の呼び出しが制限されるように、一部のオンラインジャッジを構成することができます。たとえば、裁判官の管理者が奇妙な理由でfgetsを使用する必要があると思われる場合は、scanfとなります。実際にはC言語の場合はiostreamとなります。しかし、これはすでに領域と推測されています。これが妥当かどうかを判断するために裁判官の文書を読んでみてください。

+1

これは、MinGWで 'SCNd32'マクロが全く定義されていないことを私に驚かせます。標準では、システムが32ビットの固定幅の整数をサポートしている場合、このマクロを 'inttypes.h 'に定義する必要があることに注意してください。 –

+1

はい、問題は1 << 31でした。 –