n * (n – 1) * (n – 2) * … 2 * 1
と整数nから1になるまで1づつ減らした数値を全て掛け合わせたものがnの階乗(n!)です。
nの階乗はfor文、while文などの繰り返し処理を使って1~nまで掛け合わせて求められる他、再帰処理関数を使って求めることも可能です。
再帰処理関数を使う場合は、nが1になった場合に1を返すなどの終了処理を忘れずに行うようにします。終了処理が無いと無限に再帰処理を繰り返すようになってシステムトラブルの原因になりかねない。
それから、階乗を使うことによって、順列(n個からr個取り出して並べる)、組合せ(n個からr個取り出した組合せの数)を求めることもできます。
順列は、n! / (n-r)!
組合せは、n! / r! * (n – r)!
で計算できます。
今回は、標準入力された整数nと整数rについて、nの階乗、rの階乗、n個からr個取り出した場合の順列と組み合わせを出力する処理を、C#、Java、JavaScript、PHP、Python3、Rubyの6言語で書いてみました。
C#
using System;
public class Sample{
//引数として渡された整数numの階乗を計算して返す
public static int factr(int num){
if (num <= 1){
return 1;
} else {
return num * factr(num - 1);
}
}
public static void Main(){
//nの階乗、rの階乗、順列、組合せを計算して出力
var line = Console.ReadLine().Trim().Split(' ');
var n = int.Parse(line[0]);
var r = int.Parse(line[1]);
var p = factr(n) / factr(n - r);
var c = p / factr(r);
Console.WriteLine("nの階乗:" + factr(n));
Console.WriteLine("rの階乗:" + factr(n));
Console.WriteLine("順列:" + p);
Console.WriteLine("組合せ:" + c);
}
}
Java
import java.util.*;
public class Main {
//引数として渡された整数numの階乗を計算して返す
public static int factr(int num){
if (num <= 1){
return 1;
} else {
return num * factr(num - 1);
}
}
public static void main(String[] args) throws Exception {
//nの階乗、rの階乗、順列、組合せを計算して出力
Scanner scan = new Scanner(System.in);
var line = scan.nextLine().trim().split(" ");
int n = Integer.parseInt(line[0]);
int r = Integer.parseInt(line[1]);
int p = factr(n) / factr(n - r);
int c = p / factr(r);
System.out.println("nの階乗:" + factr(n));
System.out.println("rの階乗:" + factr(r));
System.out.println("順列:" + p);
System.out.println("組合せ:" + c);
}
}
JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
reader.on('close', () => {
//引数として渡された整数numの階乗を計算して返す
function factr(num){
if (num <= 1){
return 1;
} else {
return num * factr(num - 1);
}
}
//nの階乗、rの階乗、順列、組合せを計算して出力
var arr = lines[0].trim().split(' ');
var n = parseInt(arr[0]);
var r = parseInt(arr[1]);
var p = factr(n) / factr(n - r);
var c = p / factr(r);
console.log("nの階乗:" + factr(n));
console.log("rの階乗:" + factr(r));
console.log("順列:" + p);
console.log("組合せ:" + c);
});
PHP
<?php
//引数として渡された整数numの階乗を計算して返す
function factr($num){
if ($num <= 1){
return 1;
} else {
return $num * factr($num - 1);
}
}
//nの階乗、rの階乗、順列、組合せを計算して出力
$line = trim(fgets(STDIN));
$arr = explode(' ',$line);
$n = $arr[0];
$r = $arr[1];
$p = factr($n) / factr($n - $r);
$c = $p / factr($r);
echo "nの階乗:".factr($n)."\n";
echo "rの階乗:".factr($r)."\n";
echo "順列:".$p."\n";
echo "組合せ:".$c."\n";
?>
Ruby
#引数として渡された整数numの階乗を計算して返す
def factr(num)
if num <= 1
return 1
else
return num * factr(num - 1)
end
end
#nの階乗、rの階乗、順列、組合せを計算して出力
line = gets.chomp.split(' ').map(&:to_i)
n = line[0]
r = line[1]
pp = factr(n) / factr(n - r)
cc = pp / factr(r)
puts "nの階乗:#{factr(n)}"
puts "rの階乗:#{factr(r)}"
puts "順列:#{pp}"
puts "組み合わせ:#{cc}"
C#、Java、JavaScript、PHP、Rubyの5言語については、引数として渡された整数から1づつ減らしながら掛け合わせていく再帰処理を使って階乗を求める関数factr(num)を定義。
この定義したfactr(num)を使って、整数nの階乗、整数rの階乗、順列、組合せを計算して出力する処理を、それぞれの言語で書いています。
Python3
import math
line = input().rstrip().split(' ')
n = int(line[0])
r = int(line[1])
p = int(math.factorial(n) / math.factorial(n - r) )
c = int(p / math.factorial(r))
print("nの階乗:" + str(math.factorial(n)))
print("rの階乗:" + str(math.factorial(r)))
print("順列:" + str(p))
print("組合せ:" + str(c))
Python3には、nの階乗を計算する組み込み関数(メソッド)math.factorial(n)実装されてます。imoport mathでモジュールを予め読み込むことで、math.factorial(n)が使えるようになります。
Python3については、組み込み関数(メソッド)math.factorial(n)を用いて、nの階乗、rの階乗、順列、組み合わせを計算しています。