- ベストアンサー
今、流行の
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の付く数字になる予定です。 間違いとか、おかしなところがあれば指摘してください。
- みんなの回答 (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 のほうが自然」と言った意味はなぜか考えよう。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
$kazu って何で使ってるんだろう. $var を上書きすればいいような気がするんだが. あと, while の条件は $kazu > 0 の方が自然. こうすれば if の条件も減らせるしね. 他にも split + grep という手もあるな.
補足
>$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周したからといって何か変わるわけではないんですが、その部分が無駄かなと思ってこのようにしました。 何か、別の意味で言っていたのならすみません。解説をお願いします。
お礼
%の意味を誤解していました。3%10=3 なんですね。納得しました。そうすると、while文の条件が $kazu > 0 が自然という意味もわかってきます。ありがとうございました。