素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

FizzBuzz

FizzBuzzの解法で、i % (3 * 5)をしているコードを結構見る。
3と5が互いに素だからたまたま単純な掛け算で出来るだけなので、きちんと3と5の最小公倍数が15であることが分かるように書くべきだと思う。

/* vim:sw=4 et */
#include <stdio.h>

inline int is_divisible(int, int);
inline void swap(int *, int *);
int gcd(int, int);
int lcm(int, int);

int main(int argc, char *argv[]) {
    int i;
    const int n = lcm(3, 5);
    for (i = 1; i <= 100; i++) {
        if (is_divisible(i, n)) {
            printf("FizzBuzz\n");
        } else {
            if (is_divisible(i, 3))
                printf("Fizz\n");
            else if (is_divisible(i, 5))
                printf("Buzz\n");
            else
                printf("%d\n", i);
        }
    }
    return 0;
}

inline void swap(int *a, int *b) {
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

int gcd(int a, int b) {
    while (b != 0) {
        a %= b;
        swap(&a, &b);

    }
    return a;
}

int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

inline int is_divisible(int a, int b) {
    return a % b == 0;
}

僕はこのコード、2分じゃ書けそうにない。