Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用c+打印fibo大数字+;还是c语言_C++_C_Recursion_Fibonacci - Fatal编程技术网

C++ 用c+打印fibo大数字+;还是c语言

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(“您希望

我使用递归为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(“您希望在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。 有用材料:


为此,您需要实现BigInteger。在当前C++中没有这样的内置支持。你可以在网上查看一些建议

或者你也可以使用一些LIB,比如

这里还有一些实现:

  • -关于俄语描述

  • 或者在上找到一些开放的实现

  • 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