这个求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;
for(i=1;i<=24;i++)
temp=total(temp,i);
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]+=(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。

就当前位的计算来说是对的,但最后一位时判断的 t 没有加上啊;当然了,前面的也没加,但由于你说的 += 操作,所以,不影响。
这两行修改如下试试,即不用 += 而是直接加到 t 里?

    t = ( temp.num[i] - '0' ) * elementx + tempx.num[i];
    tempx.num[i] = ( t % 10 + '0' );

不知道是不是数组开小了

elemulti() 函数里,最后的进位判断考虑的 t,只是当前位的乘,没有考虑可能由低位产生的进位,如 24! 这里,23!=25....x(2)4,最后判断时,只是 2x4=8,认为没有进位,实际上是上一循环的 5x4=20 有个进位 2,加上本次的 8 就是 10,是有进位的。

不应该吧。最上面的代码,用 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。

补个截图

img