获取负数或零作为C中阶乘的输出

问题描述 投票:0回答:1

我编写了一个非常简单的程序来计算数字的阶乘,问题是从30到60大约会返回一个负数,从70会返回0。我没有做错什么。这个问题可能取决于我计算机的计算能力吗?这是代码:

#include <stdio.h>

int main(){

int x, i;
long long int f = 1;

printf("Insert a number:");
scanf("%d", &x);

    if (x == 0){
        printf("0! = 1");
     }
    else { 
        for (i = 1; i <= x; i++){
            f *= i;
        }
        printf("%d! è = %lli", x, f);
    }

return 0;
}

c factorial
1个回答
0
投票

这是我的代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

void Carry(int bit[],int pos)
{
    int i,carray=0;
    for(i=0;i<=pos;i++)
    {
        bit[i]+=carray;
        if(bit[i]<=9) 
        {
            carray=0;
        }
        else if(bit[i]>9&&i<pos)
        {
            carray=bit[i]/10;
            bit[i]%=10;     
        }
        else if(bit[i]>9&&i>=pos)
        {
            while(bit[i]>9) 
            {
                carray=bit[i]/10;  
                bit[i]%=10;       
                i++;
                bit[i]=carray;   
            }
        }
    }
}
int main()
{
    int num,pos,digit,i,j,m,n;
    double sum=0; 
    int *fact;   
    printf("input want to calculute  factorial num:");
    scanf("%d",&num);       
    for(i=1;i<=num;i++)
    {
        sum+=log10(i);
    }
    digit=(int)sum+1;  
    if(!(fact=(int *)malloc((digit+1)*sizeof(int))))
    {
        printf("malloc failed\n");
        return 0;
    }
    for(i=0;i<=digit;i++)
    {
        fact[i]=0;
    }
    fact[0]=1;
    for(i=2;i<=num;i++)
    {
        for(j=digit;j>=0;j--)
        {
            if(fact[j]!=0)
            {
                pos=j;
                break;
            }
        }
        for(j=0;j<=pos;j++)
        {
            fact[j]*=i; 
        }
        Carry(fact,pos); 
    }
    for(j=digit;j>=0;j--)
    {
        if(fact[j]!=0)
        {
                pos=j; 
                break;
        }
    }
    m=0; 
    n=0;  
    for(i=pos;i>=0;i--)
    {
        printf("%d",fact[i]);
        m++;
        if(m%4==0)  
        {
            printf(" ");
        }
        if(m==40)  
        {
            printf("\n");
            m=0;
            n++;
            if(n==10)
            {
                printf("\n");
                n=0;
            }
        }
    }
    printf("\n\n");
    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.