FizzBuzzをやってみた

気分転換にやってみたので晒します。
3で割り切れたら”Fizz”、5で割り切れたら”Buzz”、
両方で割り切れたら”FizzBuzz”、
いずれでもないときは数字を表示するアレです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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