long kai(int n){//nの階乗
long p=1;
int i;
for(i=2;i<=n;i++){
p=p*i;
}
return p;
}
long pof(int n, int r){//nのr乗
int i;
long p=1;
for (i=0 ; i < r ; i++){
p=p*n;
}
return p;
}
long combi(int n, int r){//nCr
int i;
long p=1;
for (i=1;i <= r;i++){
p=p*(n-i+1)/i;
}
return p;
}
long perm(int n, int r){//nPr
int i;
long p=1;
for (i=1;i<=r;i++){
p=p*(n-i+1);
}
return p;
}
再帰関数を使っても実装できるかもしれませんが、こちらのほうがわかりやすいので。これより高速なコードは存在しますが、簡単なのを書きました。べき乗については、繰り返し2乗法というアルゴリズムが存在します。nのr乗を、n, nの2乗, 4乗, 8乗, ……に分解して高速化する方法です。
ところで、絶対値について、絶対値を求める関数absは標準で用意されています。 普通人間が絶対値を計算したいとき、ifで場合分けして〜というコードを書きそうですが、実は、2進数のビット演算のみで、三行で構成されています。高速にできている… Cなどの言語はコンパイル作業によって最適化されます。DebugをReleaseにすると更に最適化されます。 アーキテクチャまで考えられたプログラムを書けるようになりたい・・・
0 件のコメント:
コメントを投稿