- ベストアンサー
C言語について質問です。このプログラムの作成方法
1から10の数字の隣と隣を引いた値を下に表示させるプログラムを作りたいです。 ただし使用する数字は同じ数字を使ってはいけない事。 上記のようなプログラムを作りたいのですが、for文とif文を使って作成可能でしょうか? ご指導お願いします。 数値=□ イメージ図 □ □ □ □ □ □ □ □ □ □
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
1)上から2段目のどこかに9が来て、 2)その上には(1, 10)あるいは(10, 1)が来る。 1)は3とおり。その各々に対して2)は2とおり。 つまり、1と9と10の置き方が6とおりあることになる。 これら以外の7個の数値の置き方は全部で7!=5040とおり。 よって、総当たり方式で調べる数は7!*6=30240とおり。 これくらいの数ならコンピューターは一瞬で求められるはず。 実際には、総当たりの途中で「これ以上先へ進んでもムダ」というケースが けっこうあるはずなので、本当に30240とおり全部を調べなくていいはず。
その他の回答 (5)
- asuncion
- ベストアンサー率33% (2127/6290)
あ~、よく考えたら、右から左を引くことを許さないと、 この問題は解けないわな。
- asuncion
- ベストアンサー率33% (2127/6290)
【ちょっとしたヒント2】 9 は 10-1 のケースだけですね。 さっきの【ちょっとしたヒント】で 10 は最上段に来ることがわかりましたので、 最上段とその下の段とで構成する3個の▽のうち、 どれか一つは 10 1 9 か 1 10 9 となります。後者は、右から左を引くことを許す場合。
- asuncion
- ベストアンサー率33% (2127/6290)
隣同士を引く、というのは、 左から右を引く 場合と 右から左を引く 場合とがあります。 今回のプログラムではどの場合を許しますか? 【ちょっとしたヒント】 隣同士を引いて10になることはあり得ませんね。 つまり、引き算の結果である、下向き▽の下の頂点には10は来ない、ということです。 ゆえに、10を置けるのは最上段に限られます。
- kmee
- ベストアンサー率55% (1857/3366)
> 作成可能でしょうか? それは作成可能でしょう。 大きな問題は2つ (1)条件を満す数列をどうやって見付けるか (2)どうやって数列をイメージ図のように出力するか (2)の方は簡単。 テキストエデイタなり、方眼紙なりに、実際に見栄えよく書いてみればいい。 それで数字の前後の空白の数を数えれば法則がわかるはず。 あとは、その数になるように、forで空白を出力するとか、printfの書式を調節するとかすればよい。 (1)は難しいけど、やりだすと面白い。 一番単純な方法は総当たり。全部の組合せで条件を満すか調べればいい。 組合せをよく考えれば、「絶対不可能」なパターンもわかってくる。例えば、一番下の一つが決まれば、その上の2つは特定の組合せしか有り得ない。そういう不可能な組合せを早い段階で捨てていけば、総当たりに比べて格段の速度アップすると思う。 プログラムやってて面白いのは、やはりこういう、目に見える効果が出たときだと思う。
- koi1234
- ベストアンサー率53% (1866/3459)
イメージ図の階層4階層で書かれてますが(あくまでイメージとしてなら別にかまわない) 与えられた条件でできるのはどう考えても3階層が限界ではないでしょうか (同一階層に同じ数字なら話が違う) 条件があいまいですが 出来るできないでいえばできるって答えになります ご指導ってのは プログラム例が欲しいって事? 自分で多少なり作ったコードなどは無いのでしょうか? そういったものがあってこその指導は無いですか? 取りあえず2階層が成り立つコードを考えてみては? 3-2 1 でもいいわけですよね ※↑for分にするまでもなくなってしまうが