質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

解決済

「素数の足し算で」の解き方\(スタックによる深さ優先探索\)を教えてください

kuma_dansyaku
kuma_dansyaku

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1回答

0評価

0クリップ

2151閲覧

投稿2017/05/26 04:30

はじめに

いつもお世話になっています。
先日同様の件名について質問をさせて頂きました。

「素数の足し算で」の解き方を教えてください
https://teratail\.com/questions/77349

木やグラフをしらみつぶしに探索する深さ優先探索(再帰あり)のアルゴリズムを教えて頂きました。
教えていただいたので実際に実装して確認してみました。

幅優先探索は特に問題なく実装出来ました。
しかし深さ優先探索(再帰なしでスタックを使用する方法)が上手くいきません。

ソースコードを添付しますので、指摘をお願いいたします。

C

/\* ある範囲内の素数の足し算で、ある数Xを表現するパターンがいくつ存在するかを表示するプログラム\(ある範囲は100以下とする\) 2-19 までの素数で38を表現するパターンは以下の6通りなので答えは6 \[2\+17\+19\] \[3\+7\+11\+17\] \[3\+5\+13\+17\] \[3\+5\+11\+19\] \[2\+5\+7\+11\+13\] \[2\+3\+5\+11\+17\] \*/ #include <stdio\.h> #define TRUE \(1\) /\* 成功 \*/ #define FASLE \(0\) /\* 失敗 \*/ #define STACK_SIZE \(100\) /\* スタックの数 \*/ int _stack_data\[STACK_SIZE\]; /\* スタック格納バッファ \*/ int _stack_num; int push\(int push_data\) { if \(_stack_num < STACK_SIZE\) { _stack_data\[_stack_num\] = push_data; _stack_num\+\+; /\* next elements \*/ return TRUE; } else { return FASLE; } } int pop\(int \*pop_data\) { if \(0 < _stack_num\) { _stack_num--; \*pop_data = _stack_data\[_stack_num\]; return TRUE; } else { return FASLE; } } #define N \(25\) /\* elements number \*/ int prime\[N\] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }; /\* 1-100 までの素数たち \*/ int main\(\) { int i, match_cnt; int imin, imax, ival, sum; // "6 19 38" を入力 printf\("input \[MIN\] \[MAX\] \[TTL\]\\n"\); scanf_s\("%d%d%d", &imin, &imax, &ival\); printf\("input no %d %d %d\\n", imin, imax, ival\); for \(i = 0; imin > prime\[i\]; i\+\+\); push\(prime\[i\+\+\]\); // 加算した値 push\(0\); // 加算しない値 match_cnt = 0; while \(_stack_num \) { // スタックが空っぽになるか pop\(&sum\); if \(sum == ival || \(sum \+ prime\[i\]\) == ival\) { match_cnt\+\+; // 一致した値 continue; } if \(sum > ival || \(sum \+ prime\[i\]\) > ival\) { continue; } if \(prime\[i\] > imax\) { continue; } push\(sum \+ prime\[i\+\+\]\); // 加算した値 push\(sum\); // 加算しない値 } printf\("match=%d\\n", match_cnt\); // 6が出力されて欲しい return 0; }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

t_obara
t_obara

2017/05/26 07:25

そもそもの疑問ですが、貴殿はこの問題をなぜ解決したいのですか?学校などの課題解決のため?プログラム学習のため?などなどあると思いますが、

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。