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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值