Long Long int的数量少于它假定的64位容量?

时间:2015-10-28 20:37:08

标签: c

我对生成斐波纳契数的程序有疑问。用户输入他/她需要的斐波那契数字,程序生成它。问题是在48个数字之后程序开始给出错误的数字。它似乎修剪数字给出一些随机结果。我创建了一个“unsigned long long int”数组,每个数字为64位。它应该带有大数字,但它没有。

这是我的代码:

‪#‎include‬ <stdio.h>
int main (void)
{
 int n , i ;
 printf("Enter number of Fibonacci numbers you need : ");
 scanf("%d" , &n);

 unsigned long long int fib_numbers[n];

 fib_numbers[0] = 0 ;
 printf("1. %llu\n",0);
 fib_numbers[1] = 1 ;
 printf("2. %llu\n",1);

 for(i=2;i<n;i++)
   {
    fib_numbers[i]=fib_numbers[i-1]+fib_numbers[i-2];
    printf("%d. %llu\n",i+1,fib_numbers[i]);
   }
 return 0;
}

她的输出很快,通知编号49

enter image description here

2 个答案:

答案 0 :(得分:2)

这绝对是底层库不支持64位无符号long long的问题。您的代码在我的64位Linux系统上运行良好。

<link type="text/css" href="assets/styles/main.css">

至于解决方案,这取决于您的平台,编译器等。没有足够的信息来指导。但是,您可能希望研究一个支持更大数字的系统,因为64位只能覆盖到最大值94. The GNU Multiple Precision Arithmetic Library可能会执行长时间运行所需的操作,并且可能会自动纠正库中缺少的精度同样。

答案 1 :(得分:-1)

您可以通过以下方式确定unsigned long long int类型对象的最大值

#include <limits>

//...

std::cout << std::numeric_limits<unsigned long long int>::max() << std::endl;

您可以将该值与您获得的斐波那契数字的值进行比较。

或者在C中,您可以使用标题ULLONG_MAX

中声明的常量<limits.h>

可能原因是编译器的函数printf不支持格式说明符%llu

您还可以尝试使用可能在标头PRIu64中声明的宏<inttypes.h>

例如

#include <inttypes.h>

//...

printf("%d. %" PRIu64 "\n",i+1,fib_numbers[i]);