こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

こんにちは。
自分はプログラミングを学ぶ社会人です。研修を受けておりまして、以下のような問題を出されたのですが、このような考えは正しいでしょうか?それとも手順を変えたほうがよろしいでしょうか?


<問題>
変数xには29、変数yには26が入っており、このx、yと、さらに空の変数a(20以上の数値は格納できない)の3つだけを使って、xとyの数値を入れ替える処理を行う流れ図を完成させよ。

開始

29÷10→a

26→x

10a→y

xとyを表示

終了

※「|」は、流れ図で下に向かう処理を表しています。


どうぞよろしくお願い致します。

投稿日時 - 2007-01-27 19:15:10

QNo.2700960

すぐに回答ほしいです

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

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

両方の変数のxorを取るなんて言うのもありますね。

いろいろ出して見るのもいいかもしれません。

参考URL:http://www.geocities.jp/ky_webid/algorithm/001.html

投稿日時 - 2007-01-27 20:30:58

お礼

またまたご回答ありがとうございますm(_ _)m。

>両方の変数のxorを取るなんて言うのもありますね。

この方法、新しいです!すごいですね。気が付きませんでした。

投稿日時 - 2007-01-27 20:49:37

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.11

問題のように、変数aに格納できる上限値が19であると決められている場合
は、以下のようなアルゴリズムでも良いかもしれません。

a ← x - 19 
x ← y
y ← a + 19

または、

a ← y - 19
y ← x
x ← a + 19

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

あくまでも参考意見として…。

投稿日時 - 2007-01-28 13:33:08

お礼

ご回答ありがとうございます。

>制約された条件下での問題対処法を見出してもらいたいといった目的であると考えられ、一般的に通用するアルゴリズムの形式を求められているのではなく、この問題に対して、いかに対処すべくどのように解決すべきかを考える事を目的としており、その視点でアルゴリズムを作成すればよいのではないでしょうか。

そうですね。ただ、講師陣はちょっと変わっていて、研修生のレベルを把握せずに問題を出している部分が多く、その概念を知っていないと解けないような問題も出してきます。要は、まだ研修体系が整っていないという感じです。もちろん自分も日々勉強してはいるのですが・・・。他のテストでも、「応用」というレベルではなく、教わっていないと解けないような問題を出され、解けないと不合格という感じでした。

投稿日時 - 2007-01-28 17:34:22

ANo.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整数とか仮定してくれた方が私としては分かりやすい。)

投稿日時 - 2007-01-28 13:21:05

お礼

ご回答ありがとうございます。

>そういえば変数aもそうですが、変数x、yもどういう数値が入ることがあり得るのかがはっきりしてませんね。
100とか1000もありえるのでしょうか。

限定はされていません。講師の中ではもう世界が決まっていて、ただ単に限定しなかっただけなのか、それとも敢えて限定していないのかわかりません。

「-(マイナス)」を使う方法は浮かんだのですが、「上記のような場合もあり得たらどう解けばいいんだろう?」という疑問が浮かび、別解を求めていたところでした。

投稿日時 - 2007-01-28 17:22:37

ANo.9

#3です。
>>a が整数しか扱えない場合でも、可能ですよ。
>そうなんですか。他の方がやっている方法でしょうか?

私が思いついたのは#5さんの回答と同じ方法です。

変数 a に20未満の数値を代入しているので、出題者が想定していた回答かな?と思いました。

研修と言うことなので、出題者の意図しない回答も、逆に高く評価されるかもしれませんね。奇抜な発想、アイデアは、企業にとって必要ですから。

DT50さんの回答も、想定の範囲外ではないでしょうか?
私は、整数しか扱えないと勝手に思い込んでしまい、10で割るという発想はありませんでした。

投稿日時 - 2007-01-28 13:03:23

お礼

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

投稿日時 - 2007-01-28 17:14:44

ANo.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に戻ります。(通常は、整数型、浮動小数点型しかありませんが)

投稿日時 - 2007-01-27 19:57:38

お礼

詳しくご回答頂きまして、ありがとうございます。

教える側は、「aを経由してxとyを変換するには、どのような処理をすればいいか?」ということを求めているのかと思います。

それにしても、問題そのものが大雑把で、「xとyの数値が他の値だと、解けない場合もあるなぁ」なんて考えも浮かんでくるので、どうすればいいのか困ってます(_ _;。

>10÷3→変数aのとき
変数aは、循環小数である3.33333・・・となり
これを正確に格納する変数aは、存在しません。
従ってa×3は10に戻りません。と考えられていますが、
分数型の変数を理論上仮定すれば、a=1/3と格納できますので
a×3は10に戻ります。(通常は、整数型、浮動小数点型しかありませんが)

この考え方はすごいですね。自分は勉強始めたばかりでこれが基本かどうかはわかりませんが、確かに、10で割ったものを10倍させるときに、おかしな現象が起こる可能性もあるんですね。

投稿日時 - 2007-01-27 20:09:31

ANo.6

たしかに 答えは書かないほうがいいのかな

>プログラミングを学ぶ社会人です。研修...

解答は1つじゃないし もしかしたら 解答はないかもしれない。
いろんなパターンをかんがえて その問題の悪い点をよく考え直してください。
あくまで 研修期間なので 100点の答えを書くだけじゃなく そこに 至る頭の回転を 会社は求めています。また デバックをする能力、検証する能力も求めています。

とりあえず 考え方はいい しかし もっといろんな解答ができるはずです。

投稿日時 - 2007-01-27 19:50:00

お礼

ご回答ありがとうございます。

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

投稿日時 - 2007-01-27 19:53:46

ANo.5

あくまで、この問題に限定した処理なら以下でもOKかな?

開始

x-y→a

x-a→x

y+a→y

xとyを表示

終了

投稿日時 - 2007-01-27 19:37:01

お礼

ご回答ありがとうございます。

>あくまで、この問題に限定した処理なら

そうなんですよね。この解法は自分も思いついてはいましたが、教える側がどこまで求めているのかわからなくて・・・。

どうもありがとうございました。

投稿日時 - 2007-01-27 19:56:14

ANo.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

投稿日時 - 2007-01-27 19:35:00

お礼

ご回答ありがとうございます。

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

投稿日時 - 2007-01-27 19:51:57

ANo.3

a が整数しか扱えない場合でも、可能ですよ。

答えは・・・書かない方がいいのかな。

投稿日時 - 2007-01-27 19:32:40

お礼

ご回答ありがとうございます。

>a が整数しか扱えない場合でも、可能ですよ。

そうなんですか。他の方がやっている方法でしょうか?

お教え頂ければありがたいですが、ダメでしたら結構です。

投稿日時 - 2007-01-27 19:49:52

ANo.2

aを使わないでもよいのなら
x*y→x
x/y→y
x/y→x

でいけると思います。

投稿日時 - 2007-01-27 19:32:37

お礼

ご回答ありがとうございます。

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

投稿日時 - 2007-01-27 19:47:27

ANo.1

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

投稿日時 - 2007-01-27 19:17:22

お礼

ご回答ありがとうございます。

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

投稿日時 - 2007-01-27 19:27:58

あなたにオススメの質問