54黑科技 发表于 2019-10-28 21:27:40

请问这个求阶乘的是否可以改进?

#include <stdio.h>

int main()
{
        int square(int i);
        int factorial(int j);
        int s1,s2,s,a = 2,b = 2;

        s1 = square(a);
        s2 = square(b);
        s = s1 + s2;
        printf("%d\n",s);
}

int square(int i)
{
        int m;
        m = factorial(i*i);
        return(m);
}

int factorial(int j)
{
        int k = 1;
        for(;j > 0;j--)
        {
                k = j*k;       
        }
        return(k);
}

jackz007 发表于 2019-10-28 22:45:14

本帖最后由 jackz007 于 2019-10-28 22:47 编辑

      阶乘最大的问题是溢出,所以,在不会溢出条件下,确定出可计算的最大阶数十分关键,试试下面的代码:
#include <stdio.h>

int maxd(void)
{
      unsigned long long n                                             ;
      int d                                                            ;
      for(n = 0xffffffffffffffff , d = 0 ; (n = n / (d + 1)) > 1 ; d ++) ;
      return d                                                         ;
}

unsigned long long fun(int n)
{
      unsigned long long m                                             ;
      int k                                                            ;
      m = 0                                                            ;
      if (n <= maxd()) for(m ++ , k = 0 ; k < n ; k ++) m *= (k + 1)   ;
      return m                                                         ;
}

int main(void)
{
      int k , n                                                          ;
      unsigned long long m                                             ;
      k = maxd()                                                         ;
      printf("input an integer : " , k)                        ;
      scanf("%d" , & n)                                                ;
      if(n > 0 && n <= k) printf("%I64u\n" , fun(n))                     ;
      else printf("out of range \n" , k)                         ;
}

bin554385863 发表于 2019-10-29 03:25:53

本帖最后由 bin554385863 于 2019-10-29 05:15 编辑

#include <stdio.h>
int fact(int n)
{
      int res = 1, int_max = INT32_MAX;
      if(n < 0)//排除负数
      {
                return -1;
      }
      if(n == 0)//特殊值
      {
                return 1;
      }
      for(size_t i = n; i >= 1; i--)
      {
                int_max /= i;
      }
      if(int_max < 1)//判断是否会发生溢出
      {
                printf("基数过大,无法计算\n");
                res = -1 ;
      }
      else
      {
                for(int i = 1; i <= n; i++)
                {
                        res *= i;
                }
      }
      return res;
}
int main(int args char * argc)
{
      int a = 0;
      scanf("%d", &a);
      printf("%d", fact(a));
      return0;
}

54黑科技 发表于 2019-10-29 13:01:46

bin554385863 发表于 2019-10-29 03:25


好的,谢谢您!
页: [1]
查看完整版本: 请问这个求阶乘的是否可以改进?