为什么我无法正确打印第 47 个斐波那契数?
Why am i not able to print 47th fibonacci number correctly?
我使用的是 64 位操作系统,然后我也无法正确打印小于 40 亿的第 46 个斐波那契数。
#include<cs50.h>
#include<stdio.h>
int main(void)
{
unsigned int n=50;
int array[n];
array[0]=0;
array[1]=1;
printf("%i\n",array[0]);
printf("%i\n",array[1]);
for(int i=2;i<n;i++)
{
array[i]=array[i-1]+array[i-2];
printf("%i\n",array[i]);
}
i am not able to print 46th fibonacci number correctly which is less than 4 billion.
您很可能超出了整数范围,即 -4294967296 到 4294967295。
将int array[n];
更改为long long array[n];
此外,printf 应从 %i
更改为 %lli
编辑:在 运行 数字上,您得到 F(48) 的预期值为 4807526976,这超出了整数范围。
使用 Rishikesh Raje 的计数系统(即第一个斐波那契数为 1),其中 F(48) 为 4807526976,那么您无法获得 F(47) 2971215073,因为正如@kaylum 评论的那样,您使用了有符号整数数组来保存您需要更改为无符号的值,以及更改您的 printf 语句以打印无符号。这将使您达到 32 位算术的限制:
#include <stdio.h>
#define LIMIT (50)
int main(void) {
unsigned int array[LIMIT] = {0, 1};
printf("%u\n", array[0]);
printf("%u\n", array[1]);
for (size_t i = 2; i < LIMIT; i++)
{
array[i] = array[i - 1] + array[i - 2];
printf("%u\n", array[i]);
}
return 0;
}
要超过 32 位,您可以按照 Rishikesh Raje 的建议切换到 long 或 long long,但如果您想达到给定位数的最大结果,请使用无符号变体。
你必须使用 long long 作为数组的数据类型。因为您要存储整数范围的超出范围的数字。(-2,147,483,648 到 2,147,483,647)
并且 int i 的声明应该在 for 循环之前。
#include<stdio.h>
int main(void)
{
int n=50;
long long array[n];
array[0]=0;
array[1]=1;
printf("%lli\n",array[0]);
printf("%lli\n",array[1]);
int i;
for(i=2;i<n;i++)
{
array[i]=array[i-1]+array[i-2];
printf("%lli\n",array[i]);
}
}
要么使用无符号整数数组,要么使用 unsigned long long long 数组以获得更高的值,但您不需要数组来打印斐波那契数列,您可以简单地这样做:-
void main()
{
unsigned long long i=1, num1=1, num2=0;
printf("1 \n");
for(i; i<100 ; i++)
{
num1=num1+num2;
num2=num1-num2;
printf("%lli \n", num1);
}
getch();
}
我使用的是 64 位操作系统,然后我也无法正确打印小于 40 亿的第 46 个斐波那契数。
#include<cs50.h>
#include<stdio.h>
int main(void)
{
unsigned int n=50;
int array[n];
array[0]=0;
array[1]=1;
printf("%i\n",array[0]);
printf("%i\n",array[1]);
for(int i=2;i<n;i++)
{
array[i]=array[i-1]+array[i-2];
printf("%i\n",array[i]);
}
i am not able to print 46th fibonacci number correctly which is less than 4 billion.
您很可能超出了整数范围,即 -4294967296 到 4294967295。
将int array[n];
更改为long long array[n];
此外,printf 应从 %i
更改为 %lli
编辑:在 运行 数字上,您得到 F(48) 的预期值为 4807526976,这超出了整数范围。
使用 Rishikesh Raje 的计数系统(即第一个斐波那契数为 1),其中 F(48) 为 4807526976,那么您无法获得 F(47) 2971215073,因为正如@kaylum 评论的那样,您使用了有符号整数数组来保存您需要更改为无符号的值,以及更改您的 printf 语句以打印无符号。这将使您达到 32 位算术的限制:
#include <stdio.h>
#define LIMIT (50)
int main(void) {
unsigned int array[LIMIT] = {0, 1};
printf("%u\n", array[0]);
printf("%u\n", array[1]);
for (size_t i = 2; i < LIMIT; i++)
{
array[i] = array[i - 1] + array[i - 2];
printf("%u\n", array[i]);
}
return 0;
}
要超过 32 位,您可以按照 Rishikesh Raje 的建议切换到 long 或 long long,但如果您想达到给定位数的最大结果,请使用无符号变体。
你必须使用 long long 作为数组的数据类型。因为您要存储整数范围的超出范围的数字。(-2,147,483,648 到 2,147,483,647) 并且 int i 的声明应该在 for 循环之前。
#include<stdio.h>
int main(void)
{
int n=50;
long long array[n];
array[0]=0;
array[1]=1;
printf("%lli\n",array[0]);
printf("%lli\n",array[1]);
int i;
for(i=2;i<n;i++)
{
array[i]=array[i-1]+array[i-2];
printf("%lli\n",array[i]);
}
}
要么使用无符号整数数组,要么使用 unsigned long long long 数组以获得更高的值,但您不需要数组来打印斐波那契数列,您可以简单地这样做:-
void main()
{
unsigned long long i=1, num1=1, num2=0;
printf("1 \n");
for(i; i<100 ; i++)
{
num1=num1+num2;
num2=num1-num2;
printf("%lli \n", num1);
}
getch();
}