我对生成斐波纳契数的程序有疑问。用户输入他/她需要的斐波那契数字,程序生成它。问题是在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
答案 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]);