[03a2] 素因数分解を大きい方から

コマンド引数で与えられた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]; }

プログラムでは下請け関数は用いないこと。

記号列 

コード 

選択肢

ア #include <stdbool.h>
イ #include <stdio.h>
ウ #include <stdlib.h>
エ #include "istack.h"
オ int main(int argc, char *argv[]) {
カ return 0;
キ }
ク for(i = 2; i <= n; ++i) {
ケ for(i = 1; i < n; ++i) {
コ for(i = 0; i < n; ++i) {
サ if(i == 0) { break; }
シ if(i != 0) { break; }
ス while(!istack_isempty(s)) {
セ while(n % i == 0) {
ソ while(n % i != 0) {
タ while(true) {
チ int i, n;
ツ istack_push(s, i);
テ istackp s = istack_new(100);
ト n = atoi(argv[1]);
ナ n = n / i;
ニ printf("%d\n", istack_pop(s));
ヌ printf("i> "); scanf("%d", &i);

選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。