C语言 斐波纳契 大数溢出,c++ - 用C ++或C语言打印fibo大数字 - 堆栈内存溢出

代码溢出了使用long的整数的范围。

可以使用long long ,但是即使这样也可能无法处理需要至少69位的Fib(100) 。

如果1.0/LDBL_EPSILON > 3.6e20则代码可以使用long double

存在各种库来处理非常大的整数。

对于此任务,所需要的只是一种将两个大整数相加的方法。 考虑使用字符串。 随后是效率低下但简单的字符串添加。 没有意外的缓冲区溢出。

#include

#include

#include

char *str_revese_inplace(char *s) {

char *left = s;

char *right = s + strlen(s);

while (right > left) {

right--;

char t = *right;

*right = *left;

*left = t;

left++;

}

return s;

}

char *str_add(char *ssum, const char *sa, const char *sb) {

const char *pa = sa + strlen(sa);

const char *pb = sb + strlen(sb);

char *psum = ssum;

int carry = 0;

while (pa > sa || pb > sb || carry) {

int sum = carry;

if (pa > sa) sum += *(--pa) - '0';

if (pb > sb) sum += *(--pb) - '0';

*psum++ = sum % 10 + '0';

carry = sum / 10;

}

*psum = '\0';

return str_revese_inplace(ssum);

}

int main(void) {

char fib[3][300];

strcpy(fib[0], "0");

strcpy(fib[1], "1");

int i;

for (i = 2; i <= 1000; i++) {

printf("Fib(%3d) %s.\n", i, str_add(fib[2], fib[1], fib[0]));

strcpy(fib[0], fib[1]);

strcpy(fib[1], fib[2]);

}

return 0;

}

输出量

Fib( 2) 1.

Fib( 3) 2.

Fib( 4) 3.

Fib( 5) 5.

Fib( 6) 8.

...

Fib(100) 3542248xxxxxxxxxx5075. // Some xx left in for a bit of mystery.

Fib(1000) --> 43466...about 200 more digits...8875

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值