不应该吧。最上面的代码,用 AStyle 重排了下,就修改了上面两行,24! 结果和 windows 的计算器一样,加了输入 n 值计算 99!,前面的也和 windows 的计算器的一样。
// 这个求99以内阶乘的程序怎么错了?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char num[200];//大数
int count; // 大数的位数
} data;
data total(data temp,int num);
data elemulti(data temp,int elementx);
int main(int argc, char *argv[])
{
data temp= {{'1'},1};
int i, ic;
printf("n=");
scanf("%d", &ic);
for(i=1; i<=ic; i++)
temp=total(temp,i);
printf("%d!=", ic);
for(i=temp.count-1; i>=0; i--)
printf("%c",temp.num[i]);
return 0;
}
data elemulti(data temp,int elementx)
{
int i,t;
data tempx= {{0}};
for(i=0; i<temp.count; i++)
{
t=(temp.num[i]-'0')*elementx+tempx.num[i];
tempx.num[i]=(t%10+'0');
if(tempx.num[i]-'0'>=10)
{
tempx.num[i+1]+=1;
tempx.num[i]=(tempx.num[i]-'0')%10+'0';
}
tempx.num[i+1]+=t/10;
if((i==temp.count-1)&&(t/10>0))
{
temp.count++;
tempx.num[i+1]+='0';
break;
}
}
tempx.count=temp.count;
return tempx;
}
data total(data temp,int num)
{
data temp1,temp2;
int i,t=0;
int element1=num%10;//个位
int element2=(num/10)%10;//十位
if(element2==0)
temp=elemulti(temp,element1);
else
{
temp1=elemulti(temp,element1);
temp2=elemulti(temp,element2);
temp.num[0]=temp1.num[0];
temp.count=temp2.count+1;
for(i=0; i<temp2.count; i++) //个位与十位相加
{
if(i<temp1.count-1)
{
temp.num[i+1]=t+temp2.num[i]+temp1.num[i+1]-'0';
t=0;
}
else
{
temp.num[i+1]=temp2.num[i]+t;
t=0;
}
if(temp.num[i+1]-'0'>9)
{
t=((temp.num[i+1]-'0')/10);
temp.num[i+1]=(temp.num[i+1]-'0')%10+'0';
if(i==temp2.count-1)
{
temp.count++;
temp.num[i+2]=t+'0';
}
}
}
}
return temp;
}
// 23的阶乘都能算,24的阶乘最高位差了1。