WordPressの記事移植。
コードの書き方がチョイ違うけど、基本的なMarkdownは一緒なので、
いい感じ。
問題
以下の制約を守り、Nの階乗(N!)を返すint computeFactorialN(N)
メソッドを実装してください。
制約:if, switch, for, while,比較演算子は利用不可
正解
ちなみにcomputeFactorialN(0) = 0
になるのと、
すぐint
がオーバーフローするのはドンマイ。
Answer.cpp
#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 < 10; i++){
std::cout << "computeFactorialN(" << i
<< ") = " << computeFactorialN((int)i) << std::endl;
}
return 0;
}
0!=1の実装はあと2つくらいメソッドを追加すればおっけー。
Javaは0の判断を以下のように行い、メソッドを切り替えればできると別の先輩が教えてくれた
JavaAnswer.java
( (n * -1) >>> (Integer.size() - 1) )