以下是引用sinoautom在2010-8-17 14:37:53的发言:
当n<=33时运行正常,当n>=34时就错误了~~
代码:#include <stdio.h>
long a[10000];
void fun(int n);/*计算n的阶乘*/
int main(void)
{
int n;
printf("%d please input the number n\n",sizeof(long));
scanf("%d",&n);
fun(n);
return 1;
}
void fun(int n)
{
int count=0;
int i;
int j;
int k;
int inc;
for(i=0;i<10000;i++)
a[i]=0;
a[0]=1;
for(i=1;i<=n;i++)
{
inc=0;
for(j=0;j<=count;j++)
{
a[j] = i * a[j] + inc;
inc = a[j] / 10;
a[j] = a[j] % 10;
}
if(inc > 0) /* 出现溢出的是inc乘到i后的这个进位累积的太大,最终出现溢出的*/
{
count++;
a[count] = inc;
printf("\n%d\n",inc); /*在这里,你可以输出下看看*/
}
for(k=count;k>=0;k--)
printf("%ld",a[k]);
printf("\n");
}
for(i=count;i>=0;i--)
printf("%ld",a[i]);
printf("\n");
}
编译环境为GCC
我的改进:
程序代码:
#include <stdio.h>
long a[10000];
void fun(int n);/*计算n的阶乘*/
int main(void)
{
int n;
printf("%d please input the number n\n",sizeof(long));
scanf("%d",&n);
fun(n);
return 1;
}
void fun(int n)
{
int count=0;
int i;
int j;
int k;
int inc;
for(i=0;i<10000;i++)
a[i]=0;
a[0]=1;
for(i=1;i<=n;i++)
{
inc=0;
for(j=0;j<=count;j++)
{
a[j] = i * a[j] + inc;
inc = a[j] / 10;
a[j] = a[j] % 10;
}
while(inc) /*处理最后的进位,只要超过10,就继续进位*/
{
count++;
a[count] = inc;
inc = a[count] / 10;
a[count] = a[count]%10;
}
for(k=count;k>=0;k--)
printf("%ld",a[k]);
printf("\n");
}
for(i=count;i>=0;i--)
printf("%ld",a[i]);
printf("\n");
}
经过测试,结果没问题
[
本帖最后由 jack10141 于 2010-8-17 15:28 编辑 ]