My External Storage

ソフトウェアエンジニア向けTips。Qiitaにもメモ

某IT会社のGeekな先輩から出された問題。

問題


以下の制約を守り、Nの階乗(N!)を返すint computeFactorialN(N)メソッドを実装してください。
制約if, switch, for, while,比較演算子は利用不可













正解


たしかにJavaは思いつかない。Boolean型の仕様が厳しい。
ちなみにcomputeFactorialN(0) = 0になるのと、
すぐintがオーバーフローするのはドンマイ。

#include <iostream>;

static int computeFactorialNotOne(int n);

static bool notEqualOne(int n){
    return (bool)(n >> 1);
}

static int computeFactorialOne(int n){
    return 1;
}

static int (*factorials[2])(int) = {computeFactorialOne, computeFactorialNotOne};

static int computeFactorialNotOne(int n){
    return n * factorials[notEqualOne(n)](n - 1);
}


static int computeFactorialN(int n){
    return computeFactorialNotOne(n);
}

int main(){

    for(int i = 1; i &lt; 10; i++){
        std::cout << "computeFactorialN(" << i 
            << ") = " << computeFactorialN((int)i) << std::endl;
    }
    return 0;
}

0!=1の実装はあと2つくらいメソッドを追加すればおっけー。
Javaは0の判断を以下のように行い、メソッドを切り替えればできる

( (n * -1) >>> (Integer.size() - 1) )