SRM 572 DIV2 250

与えられた整数の集合の総乗について、
・正数の場合、文字列"POSITIVE"を返せ。
・負数の場合、文字列"NEGATIVE"を返せ。
・0の場合、文字列"ZERO"を返せ。

総乗とは「集合に含まれる要素をすべて乗算した数」です。
素数が多い場合、何も考えずに乗算していくと、軽くオーバーフローを起こしてしまうので、実際に計算してはいけない。というのがポイントですね。

まあ、ただ単に、

1.全要素を舐めて、負数の出現回数を数える(以下を上から順に評価)。
 1−1 0が含まれる場合、"ZERO"を返して終了。
 1−2 負数の出現回数が偶数の場合、"POSITIVE"を返して終了。
 1−3 奇数の場合、"NEGATIVE"を返して終了。

ということです。
この問題は簡単すぎですが、DIV2のスコア250も、難易度にバラツキがありますね。

  1 #include <stdio.h>
  2 
  3 #define NUM_OF(array)   (sizeof(array)/sizeof(*array))
  4 
  5 const char *EasyHomework_determineSign(const int *A, const size_t A_numof)
  6 {
  7     int i;
  8     int negative_occur_num = 0;
  9 
 10     for(i=0; i<A_numof; i++){
 11         if(A[i] == 0){
 12             return "ZERO";
 13         }
 14         if(A[i] < 0){
 15             negative_occur_num++;
 16         }
 17     }
 18 
 19     if(negative_occur_num % 2 == 0){
 20         return "POSITIVE";
 21     }
 22 
 23     return "NEGATIVE";
 24 }
 25 
 26 int main(void)
 27 {
 28     const int A[] = { -5, 7, 2};
 29 
 30     printf("Returns: %s\n", EasyHomework_determineSign(A, NUM_OF(A)));
 31 
 32     return 0;
 33 }