一段代码,求解释解决思路

一段代码,求解释void main(){int Data[40]int Digitint i,j,r,kint Nfor(i1i40i++)Data[i]0Data

一段代码,求解释
void main()
{
int Data[40];
int Digit;
int i,j,r,k;
int N;
for(i=1;i<40;i++)
Data[i]=0;
Data[0]=1;
Data[1]=1;
Digit=1;
printf("Enter a number what you want to calculus:");
scanf("%d",&N);
for(i=1;i<N+1;i++)
{
for(j=1;j<Digit+1;j++)
Data[j]*=i;
for(j=1;j<Digit+1;j++)
{
if(Data[j]>10)
{
for(r=1;r<Digit+1;r++)
{
if(Data[Digit]>10)
Digit++;
Data[r+1]+=Data[r]/10;
Data[r]=Data[r]%10;
}
}
}
printf("%d!= ",i);
for(k=Digit;k>0;k--)
printf("%d",Data[k]);
printf("\n");
}
}

该段代码可输出任意数字的阶乘,看了半天也没看懂,特别是Digit这个变量,它的值在当i<10时就没变过。另外,当输入34时,输出的结果从27!开始后面的结果都是错误的。求解释啊。。。

[解决办法]
Digit是表示是几位数的.
小于10是1位数,所以是1.大于10小于100是2位数,才是2
[解决办法]
int Data[40];
 所以,数组最大才40位,超过了就溢出,自然就不是正确结果了.
[解决办法]
这个是小学竖式乘法的改进,基本上算是 模拟。

结果错误是因为判断的地方有问题

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>void main(){    int Data[40];    int Digit;    int i,j,r,k;    int N;    for(i=1;i<40;i++)        Data[i]=0;    Data[0]=1;    Data[1]=1;    Digit=1;    printf("Enter a number what you want to calculus:");    scanf("%d",&N);    for(i=1;i<N+1;i++)    {        for(j=1;j<Digit+1;j++)            Data[j]*=i;        for(j=1;j<Digit+1;j++)        {            if(Data[j]>=10)    // =            {                for(r=1;r<Digit+1;r++)                {                    if(Data[Digit]>=10) // =                        Digit++;                    Data[r+1]+=Data[r]/10;                    Data[r]=Data[r]%10;                }            }        }        printf("%d!= ",i);        for(k=Digit;k>0;k--)            printf("%d",Data[k]);        printf("\n");    }}