- ベストアンサー
for文である数の倍数になるまでの個数を調べる
ある数に1つずつ足して、8の倍数になるまで、ある数と1ずつ足した数が合わせて何個あるかという条件をfor文で書くにはどうすればいいですか。 例えば、7だったら8まで2個あって、 14だったら、8の倍数の16まで3個あります。 それをfor文で現す方法です。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
難しく考えずに命題通りやればいいじゃん <?PHP $num=7; for($i=1;$i<=8;$i++){ if(($num+$i-1)% 8 ==0) break; } print $i; ?>
その他の回答 (4)
- hitomura
- ベストアンサー率48% (325/664)
#4 ulisrt 様 > calcStepTo8(8)は9になってしまいますよ? ……あ゛。 えーと、恥ずかしい間違いをしちゃいました。 一文で表すなら (9 - src % 8) % 8 になるのですが、たった 1 / 8 の場合のために 8 の剰余を使うのはもったいないというかなんというか。 if 文で切り分けて if (src % 8 == 0){ return 1; } else { return 9 - src % 8; } とするか、あるいは条件演算子を使って return (src % 8 == 0) ? 1 : (9 - src % 8); とするかですかね。 同じ計算を 2 回しているので、それは何らかの変数に格納するという手もあります。 あとは C/C++ 限定の方法として int rem; return (rem = src % 8) ? 9 - rem : 1 という手もありますが、……まあ、他人がこんなコード出して来たらそいつを殴りますなw
お礼
ありがとうございます。
例えば「ある数」が8のとき、 1. 判定値 ← ある数、結果 ← 1 2. 判定値が 8 で割り切れるか? Yes なら 5. へ、No なら 3. へ 3. 判定値 ← 判定値 + 1、結果 ← 結果 +1 4. 2. へ 5. 結果が求める値である。 上の「結果」は1となり正しい解だと思いますが、 calcStepTo8(8)は9になってしまいますよ?
お礼
ありがとうございます。
- hitomura
- ベストアンサー率48% (325/664)
……っと、まあ最初の回答だけではただ単にふざけているだけと思われそうなので、真面目な説明を。 はっきり言って今回の問題は for 文の一番目に書いたとおり一回の簡単な計算だけで答えが出せます。 それに対してループを使う場合は今回の場合毎回剰余計算が走ることになります。 つまり計算を行わなくてはならない回数が計算だけで出す場合に比べて多くなり、その分時間がかかってしまいます。 したがって、今回のようなわざわざループを回さなくても簡単な計算で値を求められる場合は後者の方が一般に優れています。 それでもなんかの宿題等でどうしてもループを使わなくてはならないならば、求める値は以下のアルゴリズムで出せます。 1. 判定値 ← ある数、結果 ← 1 2. 判定値が 8 で割り切れるか? Yes なら 5. へ、No なら 3. へ 3. 判定値 ← 判定値 + 1、結果 ← 結果 +1 4. 2. へ 5. 結果が求める値である。 あとは上記をあなたがコーディングしたい言語の for の仕様に合わせて書くだけです。
お礼
たしかに、単に8で割り切れる数を調べるなら、for文使う必要ないですね。 ループを回すと、余計な処理が増えるという件、了解です。 8で割り切れる数になるまで ループを回せばいいという説明でヒントを得て、最終的にPHPですが、以下のような関数になりました。 <?php function tillEight($x){ $y = 0; for (; $y <= 8 - ($x % 8); $y++) { } return $y; } もっといい書き方あるかもわからないですけど、一応これでできました。 詳しいご説明ありがとうございました。
- hitomura
- ベストアンサー率48% (325/664)
C でよければ以下のコードを参考にどうぞ。 int calcStepTo8(int src) { int result; for (result = 9 - src % 8; 0;); return result; } ……何か問題でも? ちゃんと for を使っているでしょ?
お礼
for文使わなくても、phpだと <?php function tillEight($x){ return 9 - ($x % 8); } で終わるということですね。 大変参考になりました。 ありがとうございました。
お礼
なるほど、そのままやればいいんですね。 for文の中にif文書いちゃえばいいんですね。 breakというとても便利なものもありましたね。 難しく考えすぎてました。 ありがとうございます。