予選問題3 解答と解説


正解
    Pascal        keta[k]:=n mod p;
    C             keta[k]=n%p;
    Quick BASIC   keta(k)=n MOD p

 bkbk-1...b1b0 (bk > 0, 各 bi は 0 〜 p-1 の 範囲の整数)が正整数 n の p 進表現であるとは

n = bk*pk+bk-1*pk-1+...+b1*p1+b0

となっていることである。従って、n の p 進表現を求めるには、

  1. k = 0 とする(k の初期値設定)
  2.「bk = pk の位の1桁」←「n を p で割った余り」
  3. n を p で割った商を改めて n とする; k を1増やす
  4. n > 0 なら2へ戻る。n=0 なら終了

とすれば、下位の桁から順に求められる。答は上位の桁から順に出力 しなければならないので、b0,...,bk は配列ketaに記録しておき (Pascalの場合は keta[i+1]=bi、Cの場合はketa[i]=bi、BASICの場合は keta(i+1)=bi)、すべてが求められてからfor文で出力する。
 この問題の場合は特に p=2 ではあるが、問題文のプログラムのように一般の pに対して動作するように書く心掛けが望ましい。なお、整数(固定小数点数) の内部表現が32ビットであるコンピュータを仮定したので、maxKeta=32としている。