C++ 用c+打印fibo大数字+;还是c语言
我使用递归为show fibonacci数列编写了这段代码,但对于n>43(例如:对于n=100,show:-980107325)它不能正确显示C++ 用c+打印fibo大数字+;还是c语言,c++,c,recursion,fibonacci,C++,C,Recursion,Fibonacci,我使用递归为show fibonacci数列编写了这段代码,但对于n>43(例如:对于n=100,show:-980107325)它不能正确显示 #包括 #包括 void fibonacci系列(int); void fibonacci系列(int n) { 静态长d=0,e=1; 长c; 如果(n>1) { c=d+e; d=e; e=c; printf(“%d\n”,c); 斐波那契级数(n-1); } } int main() { 长a,n; 长i=0,j=1,f; printf(“您希望
#包括
#包括
void fibonacci系列(int);
void fibonacci系列(int n)
{
静态长d=0,e=1;
长c;
如果(n>1)
{
c=d+e;
d=e;
e=c;
printf(“%d\n”,c);
斐波那契级数(n-1);
}
}
int main()
{
长a,n;
长i=0,j=1,f;
printf(“您希望在fibonnaci系列中打印多少个数字:\n”);
scanf(“%d”和“&n”);
printf(“\nFibonacci系列:”);
printf(“%d”,0);
斐波那契级数(n);
_getch();
返回0;
}
请记住,第n个斐波那契数是(大约)((1+sqrt(5))/2)^n
这允许您获取n的值,该值允许结果适合32/64无符号整数。对于签名,请记住,您丢失一个比特。 嗯,您可以尝试在C++或C.</P>中实现BigIt。 有用材料:
fib(100)
的值太大,甚至会使64位数字溢出。要对如此大的值进行操作,您需要执行以下操作。任意精度的算术不是由C或C++标准库提供的,所以您需要自己实现或使用别人编写的库。
对于适合
long
的较小值,您的问题是使用了错误的printf
格式说明符。要打印long-long
,您需要使用%lld尝试使用不同的格式和printf
,使用unsigned以获得更宽的数字范围
如果使用无符号long-long
您应该得到直到18446 744 073 709 551 615
所以直到斐波那契系列12200160415121876738的第93个数字,但是在这之后,您将得到不正确的结果,因为第94个数字1974027421986823167
对于无符号long-long>太大了溢出所用整数的范围long
可以使用long
,但即使这样也可能无法处理至少需要69位的数据
如果1.0/LDBL\u EPSILON>3.6e20
存在各种库来处理非常大的整数
对于这个任务,所需要的只是一种将两个大整数相加的方法。考虑使用字符串。下面是一个低效但简单的字符串加法。没有缓冲区溢出的意外情况
#include <stdio.h>
#include <string.h>
#include <assert.h>
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(100)的可能副本是代码> 354224817179191975 75 /代码>这对于一个未签名的64位整数来说太大了。请缩进代码。为什么不确定这是C还是C++?仅供参考,它在我看来确实像普通的C。(并教会自己远离conio.h
函数。)
#include <stdio.h>
#include <string.h>
#include <assert.h>
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