• ベストアンサー

for文である数の倍数になるまでの個数を調べる

ある数に1つずつ足して、8の倍数になるまで、ある数と1ずつ足した数が合わせて何個あるかという条件をfor文で書くにはどうすればいいですか。 例えば、7だったら8まで2個あって、 14だったら、8の倍数の16まで3個あります。 それをfor文で現す方法です。 よろしくお願いします。

  • h_mp
  • お礼率97% (67/69)

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

難しく考えずに命題通りやればいいじゃん <?PHP $num=7; for($i=1;$i<=8;$i++){ if(($num+$i-1)% 8 ==0) break; } print $i; ?>

h_mp
質問者

お礼

なるほど、そのままやればいいんですね。 for文の中にif文書いちゃえばいいんですね。 breakというとても便利なものもありましたね。 難しく考えすぎてました。 ありがとうございます。

その他の回答 (4)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.5

#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

h_mp
質問者

お礼

ありがとうございます。

noname#208507
noname#208507
回答No.4

例えば「ある数」が8のとき、  1. 判定値 ← ある数、結果 ← 1  2. 判定値が 8 で割り切れるか? Yes なら 5. へ、No なら 3. へ  3. 判定値 ← 判定値 + 1、結果 ← 結果 +1  4. 2. へ  5. 結果が求める値である。 上の「結果」は1となり正しい解だと思いますが、 calcStepTo8(8)は9になってしまいますよ?

h_mp
質問者

お礼

ありがとうございます。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

……っと、まあ最初の回答だけではただ単にふざけているだけと思われそうなので、真面目な説明を。 はっきり言って今回の問題は for 文の一番目に書いたとおり一回の簡単な計算だけで答えが出せます。 それに対してループを使う場合は今回の場合毎回剰余計算が走ることになります。 つまり計算を行わなくてはならない回数が計算だけで出す場合に比べて多くなり、その分時間がかかってしまいます。 したがって、今回のようなわざわざループを回さなくても簡単な計算で値を求められる場合は後者の方が一般に優れています。 それでもなんかの宿題等でどうしてもループを使わなくてはならないならば、求める値は以下のアルゴリズムで出せます。 1. 判定値 ← ある数、結果 ← 1 2. 判定値が 8 で割り切れるか? Yes なら 5. へ、No なら 3. へ 3. 判定値 ← 判定値 + 1、結果 ← 結果 +1 4. 2. へ 5. 結果が求める値である。 あとは上記をあなたがコーディングしたい言語の for の仕様に合わせて書くだけです。

h_mp
質問者

お礼

たしかに、単に8で割り切れる数を調べるなら、for文使う必要ないですね。 ループを回すと、余計な処理が増えるという件、了解です。 8で割り切れる数になるまで ループを回せばいいという説明でヒントを得て、最終的にPHPですが、以下のような関数になりました。 <?php function tillEight($x){ $y = 0; for (; $y <= 8 - ($x % 8); $y++) { } return $y; } もっといい書き方あるかもわからないですけど、一応これでできました。 詳しいご説明ありがとうございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

C でよければ以下のコードを参考にどうぞ。 int calcStepTo8(int src) { int result; for (result = 9 - src % 8; 0;); return result; } ……何か問題でも? ちゃんと for を使っているでしょ?

h_mp
質問者

お礼

for文使わなくても、phpだと <?php function tillEight($x){ return 9 - ($x % 8); } で終わるということですね。 大変参考になりました。 ありがとうございました。

関連するQ&A

  • 2進数が3の倍数かどうか

    ある2進数が3の倍数かどうかは、どのようにして見分けるのですか。 10進数になおす以外の方法でお願いします。

  • 倍数の個数の求め方で質問です。

    3ケタの自然数のうち、4の倍数は、 999÷4=249 余り3 99÷4=24余り3 であるから、249-24=225 とありますが、 もし、4ケタの自然数だった場合、999 9÷4の商と、999÷4の商を、 引けばいいのでしょうか? 100から200までの整数について4の倍数の個数を求めるには、200÷4の商-99÷4の商とありますが、 なぜ100ではないのですか? 教えてください。

  • テーブルのレコードをfor文を使って改行するには

    データベースをサーブレット経由で表示させているのですが、レコードの数が多くて、for文を使って改行を行いたいのですが、具体的にどうやればいいのかわかりません。 例えばIDが3の倍数の数ごとに右側に表示させるというような事をしたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 数学A 倍数の個数

    *問題* 100から200までの自然数のうち、3の倍数でも4の倍数でもない数は? 自分でやって答えは「49個」になりました! あたっていますか?もし間違っていたらご回答とご説明お願いします。

  • 85の倍数と87の倍数を足して3000に近い数

    85の倍数と87の倍数を足して3000に一番近い数字を、簡単に出す計算方法というのはないでしょうか。 ひとつひとつ足していくのが一番早道なのかどうかを知りたく質問致しました。 ご回答どうか宜しくお願い致します。

  • 2倍すると4の倍数になる数?

    こんにちは。 お世話になります。 問題集を解いていたら、下記の問題に出くわし、解法の仕方が分からず困っております。 問: 池の周りに何本かのくいが立っている。その本数は95本~110本の周であることがわかっている。 今、このくいにペンキを塗ることにした。 3本ごとに塗りながら池を1周したら最初のくいに戻り、4本ごとでは2周して初めて最初のくいに 戻った。 では、3本ごとに塗ったとき、池を1周するのに何本のくいを塗ることができるか。 解答には、95本~110本間の3の倍数と、4の倍数ではなく2倍すると4になる数をそれぞれ求めるように、と書いてあります。 3の倍数の数は、110÷3=36…2より、95本~110本間の間で最大のものは108で、それから95まで 3をどんどん引いていけば、95本~110本間の3の倍数がそれぞれ求められることが分かったのですが、「4の倍数ではなく2倍すると4になる数」が、なぜ、最大のものが「110」で、それから、次の数はそれぞれ「106、102、98」と、最大の数が「110」と2の倍数なのに、その次の数がそこから2ではなく4を引いた数になるのかが、さっぱり理解できません。 解説には、「つまり、偶数(2の倍数)ならよいのです。ただし、この問題では、4の倍数(4や8)ではだめですよ」とあります。 解説を読み、更に頭がこんがらがってしまいました。 どなたか、解き方を教えては下さいませんでしょうか? 宜しくお願いいたします。

  • 公約数、公倍数の求め方

    私は今小6で公約数、公倍数などをやっているんですが、あまり理解できません。特に「最大公倍数」「最大公約数」が分かりません。早く解けるようにもしたいです。  早く解く方法と、↑「〃」「〃」の求め方と早く解ける方法を教えて下さい。

  • 倍数の条件

    (2の倍数である条件は連続する2整数)みたいな感じで、 ある数が(3,4,6,7,8,9)の倍数である条件を教えてください!

  • 3つの数の最小公倍数の求め方について

    3つの数の最小公倍数を求めるのに、筆算を下向きに書いていく方法がありますが、 その方法の解説に、「最低2つ割れれば割って良い。割れなかった数はそのまま下ろす。」 とありますが、最低1個でも割れれば割るという方法でも答えは出せる気がします。 最低1個でも割れれば割る という方法でやるのは間違いなのでしょうか。 ただ単に煩雑になるからというような問題でしょうか。 また、数を割っていくときに、素数の小さい数から割るより、3つとも割れる数から割るほうが良いのでしょうか。 中学数学の範囲で教えて下さい。 2) 48 36 90 ────── 2) 24 18 45 ────── 2) 12  9  45 ────── 2) 6  9  45 ────── 3) 3  9  45 ────── 3) 1 3 15 ──────   1  1  5 2×2×2×2×3×3×5=720 最小公倍数は720 ============== 2) 60 45 30 ────── 2) 30 45 15 ────── 3) 15 45 15 ────── 5)  5 15 5 ────── 1 3 1 2×2×3×5×3=180 最小公倍数は180

  • 2進数において、3の倍数になる規則は?

    10進数では全ての桁の和が3の倍数になればいい では2進数において3の倍数になる規則はなんでしょうか。 逆に3進数において2の倍数になる規則はなんでしょうか。 後者は1の個数が偶数。 でいいですか? 前者についてはなかなか手法がみつかりません。。