#include<stdio.h>
#include<math.h>
int main()
{
int n,i,j;
scanf("%d",&n);
while(n--)
{
__int64 m,z[100],s=1;
double k;
scanf("%I64d",&m);
z[1]=0;z[2]=1;
for(i=3;i<=m;i++)
{
z[i]=(i-1)*(z[i-1]+z[i-2]);
}
for(j=1;j<=m;j++)
{
s*=j;
}
k=(double)z[m]*100/(double)s;
if(floor(k*100+0.5)==k*100+1)
printf("%.2f%%\n",k+0.01);
else
printf("%.2f%%\n",k);
}
return 0;
}
上面是求出总错排数/全排列;
或者直接由公式求
#include<stdio.h>
__int64 f(int n)
{
__int64 s1=1,i;
for(i=1;i<=n;i++)
s1*=i;
return s1;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
__int64 i,j,m,z[100];
double s=0;
scanf("%I64d",&m);
j=1;
for(i=2;i<=m;i++)
{
s+=j*1.0/f(i);//直接套公式求概率
j=-j;
}
printf("%.2f%%\n",s*100);
}
return 0;
}