FizzBuzzをやってみた
気分転換にやってみたので晒します。
3で割り切れたら”Fizz”、5で割り切れたら”Buzz”、
両方で割り切れたら”FizzBuzz”、
いずれでもないときは数字を表示するアレです。
use warnings;
use strict;
use integer;
foreach my $i (1..100) {
if ( calc_remainder_u08($i, 3) == 0
&& calc_remainder_u08($i, 5) == 0 ) {
print 'FizzBuzz';
}
elsif ( calc_remainder_u08($i, 3) == 0 ) {
print 'Fizz';
}
elsif ( calc_remainder_u08($i, 5) == 0 ) {
print 'Buzz';
}
else {
print $i;
}
print "\n";
}
sub calc_remainder_u08 {
my $dividend = shift;
my $divisor = shift;
# $a = ( $dividend % $divisor );
my $a = $dividend;
my $b = ( $divisor << 8 );
foreach (1..8) {
$b >>= 1;
if ( $b <= $a ) {
$a -= $b;
}
}
return $a;
}
__END__
“use integer”は、今回は不要ですが、
-1とかを算術シフトする際は必要ですよね。
今回の場合は、整数しか扱わないって意味を込めて宣言しました。
あと、”calc_remainder_u08″は、
符号なし8bit整数で余りを求めるという意図で命名しました。
なので、符号なし8bit整数しか正しく計算できません。
やってることはなつかしの筆算です。
2進数で筆算をすると九九が不要なので簡単ですよね。
おしまい。
Leave a Comment