Super Marco Richiesta di aiuto

Non capisco se ho sbagliato codice o se c’è solo un’errore di input e output, metto qua il mio codice:
#include <stdio.h>
#include <assert.h>
using namespace std;

int fact(int a) {
int r=1;
for(int i=a;i>0;i–) {
r*=i;
}
return 0;
}

double scosse(int N) {
int k,a,b,c;
double ans;
k=fact(N);
a=k/6;
if(N==1||N==2||N==3) {
switch(N) {
case 1:
ans=0;
break;
case 2:
ans=0.5;
break;
case 3:
ans=1.5;
break;
}
}
else {
c=a9+3(a-1)*a;
ans=c/k;
}
return ans;
}

int main() {
FILE *fr, *fw;
int N;

fr = fopen("input.txt", "r");
fw = fopen("output.txt", "w");
assert(1 == fscanf(fr, "%d", &N));
fprintf(fw, "%.6f\n", scosse(N));
fclose(fr);
fclose(fw);
return 0;

}

Però non tutti gli subtask erano sbagliati, ho preso 0 solo perchè “Execution killed (could be triggered by violating memory limits)” ma non è successo in tutti i casi, ho controllato e non ci sono errori di tempo o di memoria usato.

Non entro in merito alla logica del tuo codice però noto che la funzione fatt restituisce 0, forse dovrebbe restituire r, inoltre r è int e il fattoriale può essere un numero enorme!