2017-01-07 134 views
-2

問題:在標準輸入流上,我們從diapason [0,31]中得到一組數字序列。每套由-1完成。每一組都可能是空的,並且數字可能會被重複設置。 您需要找到所有集合的XOR並輸出結果的十六進制表示,即我們得到{1,2,3},{3,4},{1,5},結果爲{2,4,5},因此十六進制表示爲34.結果集中的每個數字對應於32位十六進制表示中的位。代碼中的運行時錯誤

#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

@貝塔,當然可以! –

+0

而且?你最簡單的這種測試是什麼,你確定你期望得到與法官相同的結果嗎?網站是否給出了這樣一個例子,並獲得了期望的結果? – Beta

回答

0

首先,它看起來像1 << 31是未定義的行爲。參見1signed constant,並且1 << 31不能表示在int,因此undefined。在那裏嘗試1U << currentNum以使其無符號且明確定義。

其次,SCNd32可能不是你所期望的。在我的系統上(Windows上的MinGW-w64 GCC 5.3.0),它根本沒有定義,所以你的程序不能編譯。因此,我可以想象它可以被定義爲其他意思,然後編譯但在運行時失敗。那裏嘗試一個簡單的"%d""%i"。第三,一些在線評委可能被配置爲通過在運行時調用某些函數後終止調用某些函數。例如,如果法官管理員認爲您應該使用fgets出於某種奇怪的原因,或者如果該語言實際上是C++,則可以使用iostream,其中一個此類功能可能是scanf。但這已經是猜測的領域。嘗試閱讀法官文件,看看是否是這種情況。

+1

這讓我很驚訝,MinGW中並沒有定義SCNd32宏。請注意,如果系統支持32位固定寬度整數,標準要求在'inttypes.h'中定義該宏。 –

+1

是的,問題出在1 << 31。 –