程序不返回大输入值的输出,例如 50.It 返回 0.这是一个使用递归的阶乘程序

  • 本文关键字:返回 程序 一个 阶乘 递归 It 输出 例如 c
  • 更新时间 :
  • 英文 :

/*Program to find factorial of a number using recursion*/ 
#include<stdio.h>
#include<stdlib.h>
/*Function to recursively compute factorial of a number*/
long int fact(long int n)
{
    if(n==0)
    return 1;
    return n*fact(n-1);
}
int main()
{
    long  int n;
    printf(" enter n ");
    scanf("%ld",&n);
    printf ("%ld",fact(n));  
    return 0;
}

50!30414093201713378043612608166064768844377641568960512000000000000或大约3.04e+64,一个215位的数字。 此值通常超出类型范围,例如 long 。 即使是uintmax_tunsigned long long也只需要能够表示至少 64 位整数。

long int fact(long int n) {
  ...
  // Overflows!
  return n*fact(n-1);

为了获得确切的答案,代码可以使用替代类型。 下面使用整数的字符串/十进制表示形式。 它适用于较大的n值,因为正确的功能受到缓冲区大小的限制。

char *strfact_mult(char *s, unsigned x) {
  unsigned sum = 0;
  size_t len = strlen(s);
  size_t i = len;
  while (i > 0) {
    sum += (s[--i] - '0')*x;
    s[i] = sum%10 + '0';
    sum /= 10;
  }
  while (sum) {
    len++;
    memmove(&s[1], s, len);
    s[i] = sum%10 + '0';
    sum /= 10;
  }
  return s;
}
char *str_fact(char *dest, unsigned n) {
  strcpy(dest, "1");
  while (n > 1) {
    strfact_mult(dest, n--);
  }
  return dest;
}
int main(void) {
  char buf[1000];
  puts(str_fact(buf, 0));
  puts(str_fact(buf, 1));
  puts(str_fact(buf, 5));
  puts(str_fact(buf, 50));
}

输出

1
1
120
30414093201713378043612608166064768844377641568960512000000000000

>50!是一个非常大的数字(超过 60 位),2^64小于 50! 。您没有得到正确数字的原因是您溢出,您正在计算超过计算机可以计算的限制。

enter n 50
-3258495067890909184

如果你有一个 64 位整数,它可以表示的最大值是 2^64,I 小于 50!。因此,你会溢出。

通常,在这些情况下,您会采取一些技巧,类似于运行8位代码的4位系统,将每个字的指令数加倍(英特尔的第一个CPU具有8位代码的方式)。

所以你的64位系统实际上可以处理128位的字,你只需要编写一个算法,将数据放在"块"中,这样你就可以把你的字长加倍。

它不会与标准 C 类型一起使用,您需要其他东西(可能是字符串)。请看 http://onlinemschool.com/math/formula/factorial_table/

如您所见,这是一个相当大的数字。

最新更新