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