标签:
错排简化公式:
D(n) = [n!/e+0.5]其中e是自然对数的底,[x]为x的整数部分
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstdio>
using namespace std;
const double e=exp(1);// e的1次方
int main()
{
double arr[21], tmp=1.0;
int t, n, i;
for(int i=2; i<21; i++)
{
tmp*=i;
arr[i]=round(tmp/e)/tmp;// round函数返回四舍五入整数值
}
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
printf("%.2f%%\n", arr[n]*100.0);
}
return 0;
}
N张字条的所有可能排列自然是N!(分母)。
现在的问题就是求N张字条的错排数f(N)(分子)。
首先我们考虑,如果前面N-1个人拿的都不是自己的票,即前N-1个人满足错排,现在又来了一个人,他手里拿的是自己的票。只要他把自己的票与其他N-1个人中的任意一个交换,就可以满足N个人的错排。这时有(N-1)*f(N-1)种方法。
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
double arr[21]={0, 0, 1};
for(int i=3; i<21; i++){
arr[i]=(arr[i-1]+arr[i-2])*(i-1);
}
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
double tmp=1;
for(int i=2; i<=n; i++)
tmp*=i;
cout<<fixed<<setprecision(2)<<(arr[n]/tmp)*100.0<<"%"<<endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/FightForCMU/p/4744221.html