这道题是一道有关递推的题,同时也涉及到错排,其递推关系式如下(同时也是错排公式):
f(2)=1; f(3)=2;
f(n)=(n-1)*(f(n-1)+f(n-2)), n>=3;
代码如下:
#include<cstdio>
using namespace std;
int main()
{
int n,k;
double a[25],b[25];
int i;
b[1]=1;
for(i=2;i<=24;i++)
{
if(i==2) a[i]=1;
else if(i==3) a[i]=2;
else a[i]=(i-1)*(a[i-1]+a[i-2]);
// if(i<=20) printf("%.2lf %.2lf\n",a[i],b[i]);
b[i]=b[i-1]*i; //b[i]数组记录第i个数的阶乘
// printf("%.2lf\n",b[i]);
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&k);
// printf("%lf %lf\n",a[k],b[k]);
printf("%lf\n",a[k]);
printf("%.2lf%%\n",100.0*a[k]/b[k]);
}
return 0;
}
这道题有一个需要注意的地方,题目要求以百分数的格式输出,而要输出“%”,在代码中应写为“%%”,否则会报错。