コマンド引数で与えられた1より大きい整数nの素因数分解を大きい方か ら順に出力せよい。たとえば「60」に対しては「5 3 2 2」を出力する (プログラムでは書式文字列 "%d\n" を用いて1行に1個ずつ出力する)。 アルゴリズムとしては「2で割り切れる間繰り返し割り」「3で割り切れ る間繰り返し割り」「…」のようにするのが標準的であるが、その場合 小さい方から素因数が求まるので逆順にする必要がある。そのとき、こ の問題では配列機能や再帰は使わないこと。そのかわり、次のヘッダファ イルistack.hが提供するスタック機能を呼び出して用いる。スタックサ イズは100あれば十分であるものとする。
// istack.h #include <stdbool.h> typedef struct istack *istackp; istackp istack_new(int size); bool istack_isempty(istackp p); void istack_push(istackp p, int v); int istack_pop(istackp p);
参考までにテキスト掲載の実装は次の通り。
// istack.c --- int type stack impl. with array #include <stdlib.h> #include "istack.h" struct istack { int ptr; int *arr; }; istackp istack_new(int size) { istackp p = (istackp)malloc(sizeof(struct istack)); p->ptr = 0; p->arr = (int*)malloc(size * sizeof(int)); return p; } bool istack_isempty(istackp p) { return p->ptr <= 0; } void istack_push(istackp p, int v) { p->arr[p->ptr++] = v; } int istack_pop(istackp p) { return p->arr[--(p->ptr)]; } int istack_top(istackp p) { return p->arr[p->ptr - 1]; }
プログラムでは下請け関数は用いないこと。