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 }