一段代码,求解释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"); }} 