C语言:某班有n位同学,新年到了,每人都写了一张贺年卡,将这n张贺年卡收回再发给同学们,每位同学发一张,则每人都分不到自己写的贺年卡的分卡方法共有多少种?

#include<stdio.h>
int main(void){
    int n,sum;
    scanf("%d",&n);
    sum=f(n)-f(n-1)-(n-1)*(1/2)*f(n-1);
    printf("%d",sum);
    return 0;
} 
int f(int n)
 {
    int i,fact=1;

    for(i=1;i<=n;i++)
        fact=fact*i;

    return fact;
 }

输出的答案是错的,求纠正错误。

没看明白你算法种那个公式的出处,但是感觉没有那么简单。

int f(int n)
{
int i,a,b,fact;

for(i=1;i<=n;i++)
{
    if(i==1) 
    {
        a=0;
        fact=a;
    }
    else if(i==2) 
    {
        b=1;
        fact=b;
    }
    else 
    {
        fact=(i-1)*(a+b);
        a=b;
        b=fact;
    }
}
return fact;

}

#include<stdio.h>
int main(void)
{
int n,sum;
scanf("%d",&n);
sum=f(n);
printf("%d",sum);
}