就是一个错排的公式,错排的相关简介见链接:

此题用到的公式是:f(n)=(n-1)*(f(n-1)+f(n-2));

其递推公式是:f(n)=n!(1-1/1!+1/2!-1/3!+1/4!+....................+(-1)^n*1/n!);

本题还有一点就是,set[]数组存的数据过大,约为25!用int型来存,显然不够,所以要定义为 long long型,今天看了一下long long型的数据类型,数据范围能占到8个字节,与__int64是同一个东西,只是不同编译器下的不同写法而已,其输出形式为%I64d。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long long set[25];
void fun()
{
     memset(set,0,sizeof(set));
     set[1]=0;
     set[2]=1;
     for(int i=3;i<25;i++)
     {
         set[i]=(i-1)*(set[i-1]+set[i-2]);
     }
}
int main()
{
    fun();
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%I64d\n",set[n]);
    }
    //system("pause");
    return 0;
}
posted on 2011-08-05 17:30  枫叶飘泪  阅读(695)  评论(0编辑  收藏  举报