• ベストアンサー

今、流行の

3の倍数と3の付く数字の判定ということで下のようなものを作ってみました。=~ は使っていません。 $count=0; if( ($var%3==0)or($var%10==3)or(int($var/10)==3) ) { $count++; } else { $kazu=int($var/10); while($kazu>9) { if( ($kazu%10==3)or(int($kazu/10)==3) ) { $count++; } $kazu=int($kazu/10); } } $countが1以上なら3の倍数か3の付く数字になる予定です。 間違いとか、おかしなところがあれば指摘してください。

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

  • ベストアンサー
  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

>if( ($var%3==0)or($var%10==3)or(int($var/10)==3) ) と >if( ($kazu%10==3)or(int($kazu/10)==3) ) を見ると、無駄が良く分かる。 if ($var%3==0){ # ここで3の倍数を除去 $count++; }else{ while ($var>0){ if ($var%10==3){ $count++; # 判定だけならここで終了すべき。($countは3の数を正確に表わさない) last; }else{ $var=int($var/10); # perlのint()は切り捨てなのでいつかは0になる } } こんなところか。 ・3の倍数を事前に除去すること ・($kazu%10==3)or(int($kazu/10)==3)のように、下一桁と下二桁をいっぺんに判断しているのが無駄 #1さんが「while の条件は $kazu > 0 のほうが自然」と言った意味はなぜか考えよう。

shaka001
質問者

お礼

%の意味を誤解していました。3%10=3 なんですね。納得しました。そうすると、while文の条件が $kazu > 0 が自然という意味もわかってきます。ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$kazu って何で使ってるんだろう. $var を上書きすればいいような気がするんだが. あと, while の条件は $kazu > 0 の方が自然. こうすれば if の条件も減らせるしね. 他にも split + grep という手もあるな.

shaka001
質問者

補足

>$kazu って何で使ってるんだろう. $var を上書きすればいいような気がするんだが. $varはそのままの値で使いたかったので別の変数を用意したのですが、 確かになんとかなりそうですね。 >while の条件は $kazu > 0 の方が自然. こうすれば if の条件も減らせるしね これはいまいち意味が分かりません。例えば131を判定しようとしたときに、最初$kazuは13になりますよね。13>9なのでwhile文に突入してif文の条件である$kazu%10==3に引っかかるので$countが1になります。それで、最後に$kazu=int($kazu/10) という処理をするので$kazuは1になるのでwhile文の中の処理をもう1周しなければいけません。まあ、もう1周したからといって何か変わるわけではないんですが、その部分が無駄かなと思ってこのようにしました。 何か、別の意味で言っていたのならすみません。解説をお願いします。

関連するQ&A