JOI’95 予選 問題1 解答・解説

問題1 正解 (1点)
      (a) C       m=(m+11+s*(kazu[i]-'0'))%11
                  m=(m+(s==1 ? kazu[i]-'0': 11-kazu[i]+'0'))%11}  など
          Pascal  m:=(m+11+s*(ord(kazu[i])-ord('0'))) mod\ 11
          BASIC   m=(m+11+s*(ASC(MID$(kazu$,i,1))-ASC("0"))) MOD 11
                  m=(m+11+s*VAL(MID$(kazu$,i,1))) MOD 11    など
    


 Cなら i=strlen(kazu)-1, ..., 1,0(Pascalなら i=length(kazu), ..., 2, 1、BASICなら i=LEN(kazu$), ..., 2, 1)とすれば、 自然数の右から1桁ずつが配列要素 kazu[i](BASIC では MID$(kazu$,i,1)) に文字として得られるで、これを (a) 数値に直して (b) 符号を決め (変数 s は右から奇数桁目のとき1、偶数桁目のとき-1を値にとるので、 (a)で数値に直したものに s を掛ければよい)(c) 11と足し算し、 さらにそれを (d) i-1桁目までの和(変数 m で表わしている)に加え、 (e) その結果を11で割った余りを改めて m の値とすればよい。

 この問題は以上(a)〜(e)を1つのステートメントで表わすことを求めて いるのであるが、受験者の中には複数のステートメントに分けて書いた者 が相当数いた(採点にあたってはそれも正解としたが、 そのようなものは本来正解ではないことを文脈から読み取らなければ いけない)。そのような答を書いた者のほとんどがBASICの受験者だったのは BASICでは変数宣言が不要のためであろう。