错排公式及其近似公式
错排问题详解:
http://zh.wikipedia.org/wiki/装错信封问题
解决方法,不再赘述,这里给出错排公式及其近似公式的代码实现:
1.
#include <iostream> using namespace std; int getjie(int a){ if(a==1)return 1; if(a>1){ return a*getjie(a-1); } } int main(){ int n; cin>>n; double sum=0; int da=getjie(n); for(int i=2;i<=n;++i){ if(i%2==0){ sum+=da/getjie(i); } else{ sum-=da/getjie(i); } } cout<<sum<<endl; }
2.
#include <iostream> #include <cmath> using namespace std; double getjie(int n){ if(n==1) return 1; if(n>1) return n*getjie(n-1); } double gete(){ double out=1; for(int i=1;i<100;++i){ out=out+1.0/getjie(i); } return out; } int main(){ int n; cin>>n; double out=getjie(n)*1.0/gete() +0.5; cout<<floor(out); }
这里自然对数的底数e的数值的计算,及数据较大时对阶层计算的优化,这两个问题需要改进,这里先挂起。