• ベストアンサー

簡単なアルゴリズムの添削をお願いします。

こんにちは。 自分はプログラミングを学ぶ社会人です。研修を受けておりまして、以下のような問題を出されたのですが、このような考えは正しいでしょうか?それとも手順を変えたほうがよろしいでしょうか? <問題> 変数xには29、変数yには26が入っており、このx、yと、さらに空の変数a(20以上の数値は格納できない)の3つだけを使って、xとyの数値を入れ替える処理を行う流れ図を完成させよ。 開始 | 29÷10→a | 26→x | 10a→y | xとyを表示 | 終了 ※「|」は、流れ図で下に向かう処理を表しています。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.8

No.1です。 aが20までなんて言うのがあったのでdoubleと言う宣言は意味がないのかなぁと思って勝手に整数型を規定していました。こういうところも見るのかも知れませんね。 両方の変数のxorを取るなんて言うのもありますね。 いろいろ出して見るのもいいかもしれません。

参考URL:
http://www.geocities.jp/ky_webid/algorithm/001.html
DT50
質問者

お礼

またまたご回答ありがとうございますm(_ _)m。 >両方の変数のxorを取るなんて言うのもありますね。 この方法、新しいです!すごいですね。気が付きませんでした。

すると、全ての回答が全文表示されます。

その他の回答 (10)

  • y_akkie
  • ベストアンサー率31% (53/169)
回答No.11

問題のように、変数aに格納できる上限値が19であると決められている場合 は、以下のようなアルゴリズムでも良いかもしれません。 a ← x - 19  x ← y y ← a + 19 または、 a ← y - 19 y ← x x ← a + 19 現実的にはあり得ない想定での問題なので、その程度のアルゴリズムで良いかと思います。研修の目的とは、困難な問題にぶち当たった時にあなたがどのように対処するかをこの問題を出題し考えさせる事によってどのような解を出すかを見たいという目的があるのではないでしょうか。 よって、制約された条件下での問題対処法を見出してもらいたいといった目的であると考えられ、一般的に通用するアルゴリズムの形式を求められているのではなく、この問題に対して、いかに対処すべくどのように解決すべきかを考える事を目的としており、その視点でアルゴリズムを作成すればよいのではないでしょうか。 あくまでも参考意見として…。

DT50
質問者

お礼

ご回答ありがとうございます。 >制約された条件下での問題対処法を見出してもらいたいといった目的であると考えられ、一般的に通用するアルゴリズムの形式を求められているのではなく、この問題に対して、いかに対処すべくどのように解決すべきかを考える事を目的としており、その視点でアルゴリズムを作成すればよいのではないでしょうか。 そうですね。ただ、講師陣はちょっと変わっていて、研修生のレベルを把握せずに問題を出している部分が多く、その概念を知っていないと解けないような問題も出してきます。要は、まだ研修体系が整っていないという感じです。もちろん自分も日々勉強してはいるのですが・・・。他のテストでも、「応用」というレベルではなく、教わっていないと解けないような問題を出され、解けないと不合格という感じでした。

すると、全ての回答が全文表示されます。
  • Werner
  • ベストアンサー率53% (395/735)
回答No.10

aを使えってことなら、真っ先に思いつくのは 最初に1の位を変数aを使って交換、 次は10の位・・・という様に1桁ずつ交換するやりかたです。 (10進で位取りしてるのはその方が分かりやすいと思ったからで aに0~19が入るなら20進の位取りまでいける。) 他の変数を使わないなら、#8のxorでしょうね。 > 分数型の変数を理論上仮定すれば、a=1/3と格納できますので 確かに格納できそうですが、それだと29/1は格納できなくて なぜ29/3などは格納ができるのかが凄く疑問に^^; やっぱり、それなりに実数の精度があるにもかかわらず 20以上の数値を格納できないというのは変ですね。 そういえば変数aもそうですが、変数x、yもどういう数値が入ることがあり得るのかがはっきりしてませんね。 100とか1000もありえるのでしょうか。 (どうせなら、xとyは32bit整数、aは8bit整数とか仮定してくれた方が私としては分かりやすい。)

DT50
質問者

お礼

ご回答ありがとうございます。 >そういえば変数aもそうですが、変数x、yもどういう数値が入ることがあり得るのかがはっきりしてませんね。 100とか1000もありえるのでしょうか。 限定はされていません。講師の中ではもう世界が決まっていて、ただ単に限定しなかっただけなのか、それとも敢えて限定していないのかわかりません。 「-(マイナス)」を使う方法は浮かんだのですが、「上記のような場合もあり得たらどう解けばいいんだろう?」という疑問が浮かび、別解を求めていたところでした。

すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.9

#3です。 >>a が整数しか扱えない場合でも、可能ですよ。 >そうなんですか。他の方がやっている方法でしょうか? 私が思いついたのは#5さんの回答と同じ方法です。 変数 a に20未満の数値を代入しているので、出題者が想定していた回答かな?と思いました。 研修と言うことなので、出題者の意図しない回答も、逆に高く評価されるかもしれませんね。奇抜な発想、アイデアは、企業にとって必要ですから。 DT50さんの回答も、想定の範囲外ではないでしょうか? 私は、整数しか扱えないと勝手に思い込んでしまい、10で割るという発想はありませんでした。

DT50
質問者

お礼

再びご回答、ありがとうございます。 講師陣から、どの解法を求められているのか・・・。もしくはどの方法でもいいのか・・・。 大雑把な問題だけに、逆に難しい問題ですね(^-^;)。

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

うーん・問題自体がおかしいですね。変数aが20以上の数値を格納できないとすることが、意味不明ですね。 xに29、yに26しか入っていないという前提でよいなら、 極論すると 26→x 29→y でOKとなります。 また、 x-y→a y→x y+a→y でも、OKでしょう。 double aとしておくのも、間違いではないですが、 10*aが正確に29となる保証はありません。(double float型のため) しかしながら、問題自体が、aが20以上格納できない等という、無意味な仮定をしているので、double aとしておくのも、良いと思います。 もし、あなたの回答が、誤りと指摘されたら、 aに20以上格納できないという仮定自体が、非現実的ではあるが、それを仮定して良いなら、double float型で一切誤差が発生しないという仮定は、非現実的ではあるが、そのように仮定しても、良いと考える。 と反論してください。 10÷3→変数aのとき 変数aは、循環小数である3.33333・・・となり これを正確に格納する変数aは、存在しません。 従ってa×3は10に戻りません。と考えられていますが、 分数型の変数を理論上仮定すれば、a=1/3と格納できますので a×3は10に戻ります。(通常は、整数型、浮動小数点型しかありませんが)

DT50
質問者

お礼

詳しくご回答頂きまして、ありがとうございます。 教える側は、「aを経由してxとyを変換するには、どのような処理をすればいいか?」ということを求めているのかと思います。 それにしても、問題そのものが大雑把で、「xとyの数値が他の値だと、解けない場合もあるなぁ」なんて考えも浮かんでくるので、どうすればいいのか困ってます(_ _;。 >10÷3→変数aのとき 変数aは、循環小数である3.33333・・・となり これを正確に格納する変数aは、存在しません。 従ってa×3は10に戻りません。と考えられていますが、 分数型の変数を理論上仮定すれば、a=1/3と格納できますので a×3は10に戻ります。(通常は、整数型、浮動小数点型しかありませんが) この考え方はすごいですね。自分は勉強始めたばかりでこれが基本かどうかはわかりませんが、確かに、10で割ったものを10倍させるときに、おかしな現象が起こる可能性もあるんですね。

すると、全ての回答が全文表示されます。
  • taitirou
  • ベストアンサー率23% (33/138)
回答No.6

たしかに 答えは書かないほうがいいのかな >プログラミングを学ぶ社会人です。研修... 解答は1つじゃないし もしかしたら 解答はないかもしれない。 いろんなパターンをかんがえて その問題の悪い点をよく考え直してください。 あくまで 研修期間なので 100点の答えを書くだけじゃなく そこに 至る頭の回転を 会社は求めています。また デバックをする能力、検証する能力も求めています。 とりあえず 考え方はいい しかし もっといろんな解答ができるはずです。

DT50
質問者

お礼

ご回答ありがとうございます。 ポジティブな、とてもいいアドバイスですね。がんばります!

すると、全ての回答が全文表示されます。
  • enakenak
  • ベストアンサー率0% (0/1)
回答No.5

あくまで、この問題に限定した処理なら以下でもOKかな? 開始 | x-y→a | x-a→x | y+a→y | xとyを表示 | 終了

DT50
質問者

お礼

ご回答ありがとうございます。 >あくまで、この問題に限定した処理なら そうなんですよね。この解法は自分も思いついてはいましたが、教える側がどこまで求めているのかわからなくて・・・。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.4

>変数xには29、変数yには26が入っており 何が入っているかわかっているなら、26→x,29→yでいいのでは? とも思いますが。。 空の変数aを必要としない x + y → x x - y → y x - y → x なんていう交換アルゴリズムもあります。 http://ja.wikipedia.org/wiki/XOR%E4%BA%A4%E6%8F%9B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

DT50
質問者

お礼

ご回答ありがとうございます。 これは思いついていました。・・・が、教える側はこんな単純な方法を求めているのかと不安になりまして、別解を求めていました(*^^*)。 いろいろ方法はあるんですね。

すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

a が整数しか扱えない場合でも、可能ですよ。 答えは・・・書かない方がいいのかな。

DT50
質問者

お礼

ご回答ありがとうございます。 >a が整数しか扱えない場合でも、可能ですよ。 そうなんですか。他の方がやっている方法でしょうか? お教え頂ければありがたいですが、ダメでしたら結構です。

すると、全ての回答が全文表示されます。
回答No.2

aを使わないでもよいのなら x*y→x x/y→y x/y→x でいけると思います。

DT50
質問者

お礼

ご回答ありがとうございます。 足し算と引き算では思いつきましたが、こういう方法もあるんですね。目からうろこが落ちました! ありがとうございました。

すると、全ての回答が全文表示されます。
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

29/10で小数になるとは限らないのでは?単にaに2が入る可能性もあります。

DT50
質問者

お礼

ご回答ありがとうございます。 それは私も思いました。本当に問題文がそれだけなので、流れ図の上の方で「0→double型の変数a」のような付け加えをした方がよろしいでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A