一定要将a[22]、x、y那些很大的数用__int64定义(双下划线)不然会报错
主要思想就是 错排的种类数 除以 所有名字进行排列组合的种类数
至于错排:可以参考以下博客(十分详尽)
https://blog.csdn.net/bengshakalakaka/article/details/83420150
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int j,i,n,c,k;
double m;
__int64 a[22],y,x;
a[1]=0;
a[2]=1;
for(j=3;j<22;j++){
a[j]=(j-1)*(a[j-1]+a[j-2]);//错排公式
}
while(cin>>c){
for(k=0;k<c;k++){
cin>>n;
x=a[n];
y=1;
for(i=1;i<=n;i++){//排列组合 如A55 5*4*3*2*1
y*=i;
}
m=(float)x/y;
cout<<setprecision(2)<<fixed<<m*100<<"%"<<endl;
}
}
}