原题目:
主要思路:
我认为这道题主要有以下三个需要注意的地方:
- 排列数公式
- 错排公式,和2049题目一样
- 小数点后两位的四舍五入。(我的实现方法是,先将这个小于1的double数乘以10000,对其进行四舍五入取整,再除以100变成百分数)
源代码:
#include <iostream>
#include <math.h>
using namespace std;
unsigned long long int stairs(unsigned long long int X)
{
if(X == 0)
{
return 1;
}
unsigned long long int i = 1;
unsigned long long int result = 1;
for(i = 1; i <= X; i++)
{
result *= i;
}
return result;
}
unsigned long long int A(unsigned long long int m,unsigned long long int n)
{
unsigned long long int result;
result = stairs(n)/stairs(n-m);
return result;
}
int main()
{
unsigned long long int c;
unsigned long long int n[25];
double result[25];
unsigned long long int cuo[21];
cuo[1] = 0;
cuo[2] = 1;
for(int i = 3; i <= 20; i++)
{
cuo[i] = (i-1)*(cuo[i-1] + cuo[i-2]);
}
scanf("%llu", &c);
for(int i = 0; i < c; i++)
{
scanf("%llu",&n[i]);
}
for(int i = 0; i < c; i++)
{
result[i] = (double)cuo[n[i]]/A(n[i],n[i]);
}
for(int i = 0; i < c; i++)
{
result[i] *= 10000;
result[i] = round(result[i]);
result[i] = result[i]/100.0;
printf("%.2lf%%\n",result[i]);
}
return 0;
}