下面的程序是今天写的:
#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位以上的数值呢?利用高精度 。。。“高精度就是用一个一维数组和一个整数来表示一个超大数字,数组的每一个单元存放超大数字的每一位或者几位数,整数表示这个超大数字的位数。”