由斐波那契数列引发的问题。

来源:互联网 发布:苹果电脑删除不了软件 编辑:程序博客网 时间:2024/06/08 04:48
下面的程序是今天写的:
#include <stdio.h>unsigned long long int fib1(unsigned long long int n){unsigned long long int a=0,b=1;unsigned long long int c;if (n == 1 ){                return 0;        }        if (n == 2){                return 1;        }else {for(int i=3;i<=n;i++){c=a+b;a=b;b=c;}return c;}}int main(){ int n;printf("请输入一个正整数:");scanf("%d",&n);//for(n=1;n<100;n++){printf("f(%d)-->%Ld\n",n,fib1(n));//}return 0 ;}


问题来了···当数值超过19位时,这个数列的值就不对了,,经过查找资料和百度一翻··发现了问题的所在,原来是数值超过超出了long  long int 的取值范围。


int 型和long型的取值范围是(2^32):--2147483648~2147483647

无符号(unsigned)int 和long的取值范围是:0~4294967295

long long型 和int_64型的取值范围是(2^64):0~18446744073709551616

无符号(unsigned)int 和long的取值范围是:-9223372036854775808~9223372036854775807


而设置了long int型的斐波那契数列只能算到47位···到48位就溢出了,设置了long long型的斐波那契数列只能算到93位···到94位就溢出了。

那么怎么才能表示20位以上的数值呢?利用高精度  。。。高精度就是用一个一维数组和一个整数来表示一个超大数字,数组的每一个单元存放超大数字的每一位或者几位数,整数表示这个超大数字的位数。”