编译器上显示的输出与预期值不同。但将此值复制粘贴到Excel时会获得正确的值

编译器上显示的输出与预期值不同。但将此值复制粘贴到Excel时会获得正确的值,excel,c++14,Excel,C++14,编译器中显示的输出不正确,但当从编译器复制并粘贴到Ms Excel时,它神奇地显示为正确的输出。原因可能是什么?我如何纠正此问题 我正在解决HackerRank上的Euler#2项目。这个问题要求在给定的极限下求偶数斐波那契数的和。除了测试用例3,我通过了所有测试用例。在讨论过程中,我意识到,由于涉及对非常大的数字进行算术运算,这可能会引起一个问题。因此,我采用给定的边界条件N=4*10^16,通过我的代码获得了一个解,并将答案与我在excel中手动计算的答案进行了比较 预期答案(Excel):

编译器中显示的输出不正确,但当从编译器复制并粘贴到Ms Excel时,它神奇地显示为正确的输出。原因可能是什么?我如何纠正此问题

我正在解决HackerRank上的Euler#2项目。这个问题要求在给定的极限下求偶数斐波那契数的和。除了测试用例3,我通过了所有测试用例。在讨论过程中,我意识到,由于涉及对非常大的数字进行算术运算,这可能会引起一个问题。因此,我采用给定的边界条件N=4*10^16,通过我的代码获得了一个解,并将答案与我在excel中手动计算的答案进行了比较

预期答案(Excel):

而编译器输出为(HackerRank):

当我在excel中复制编译器输出时,事情变得有趣起来,然后我得到了科学符号4.95974E+16中的粘贴。在数字点击将单元格从普通类型转换为数字类型时,瞧!我得到了正确的预期答案

这可能是什么原因造成的?我该如何处理


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

unsigned long prep_fibonnaci[100] =     

{

1, 1, 2, 3 ,5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928650, 2111485077978050, 3416454622906700, 5527939700884750, 8944394323791460, 14472334024676200, 23416728348467600, 37889062373143900,61305790721611500

};

long T;
long N;

int main() 

{

    cin >> T;


    for (long i=0 ; i < T ; i++)
    {

      cin >> N;

      long highest_fib;
      int index;
      long sum = 0;

      for (int j = 0; j <= 82; j++) 
      {

            if (prep_fibonnaci[j] > N) 

            {
            index = j - 1;
            //cout <<"index: " << index << "\n";
            highest_fib = prep_fibonnaci[index];
            //cout <<"highest_fib: " <<highest_fib <<"\n";
            break;
            }

      }


      for (int k = 2; k <= index; k = k+3) 

      {
            sum = sum+prep_fibonnaci[k];
            //cout << "sum: " << sum << "\n";
      }


       cout << sum << "\n";

    }

    return 0;
}


#包括
#包括
#包括
#包括
#包括
使用名称空间std;
未签名的长制备纤维[100]=
{
1, 1, 2, 3 ,5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928650, 2111485077978050, 3416454622906700, 5527939700884750, 8944394323791460, 14472334024676200, 23416728348467600, 37889062373143900,61305790721611500
};
长T;
长N;
int main()
{
cin>>T;
对于(长i=0;i>N;
长纤维;
整数指数;
长和=0;
对于(int j=0;j N)
{
指数=j-1;

/> CUT< < >你如何计算你的代码> PiffyFiBasaCix/Cux>数组?从 1304969544928650代码>代码开始的值是错误的——我认为这是你的问题。Ex/P> Excel可能正在进行浮点转换和丢失精度。我相信它比C++代码少。WOLFRAM alpha得到49597426547377748,差10:Excel Uses在内部是双精度的,它最多只能表示2^53的整数,因此几乎肯定是错误的。@BrennanVincent但我对所需输出所做的计算与excel转换的值相匹配。是否有什么原因将std::cout的浮点精度格式化为按approximation@aschepler是的,这就是我现在得到了正确的答案。这篇文章看起来不像是试图回答这个问题。这里的每一篇文章都应该是明确地试图回答这个问题;如果你有批评或需要澄清这个问题,你可以(像这篇)就在它的正下方。@double beep What?这怎么不是答案?问题是为什么他的输出错误,答案是因为他的
prep\u fibonacci
预计算数组错误。它似乎准确地回答了问题。顺便说一句,这不是我的第一天。我知道有什么评论。正如你所看到的,我已经在这个问题上留下了一条评论如果你仔细看一下,你就会知道。问题不是网站,我在excel工作表中复制了这些值以删除格式,然后在数组中使用它们。我认为excel处理精度值的方式发生了变化。该值应该是1304969544928657,但excel将其改为1304969544928650请停止依赖Excel。它在内部使用double,因此完全不适合这些大型整数计算。我不确定您正在使用Excel做什么,也不确定要删除什么格式,但您应该停止。无论如何,请查看以下三个连续值:498454011879264、80651553304993、1304969544928650。添加这些值你会发现第三个数字不是前两个数字的总和。(你只需看最后一个数字就可以看到)@Brennan Vincent嘿,我现在得到了正确的答案,这就是问题所在。
49597426547377738

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

unsigned long prep_fibonnaci[100] =     

{

1, 1, 2, 3 ,5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928650, 2111485077978050, 3416454622906700, 5527939700884750, 8944394323791460, 14472334024676200, 23416728348467600, 37889062373143900,61305790721611500

};

long T;
long N;

int main() 

{

    cin >> T;


    for (long i=0 ; i < T ; i++)
    {

      cin >> N;

      long highest_fib;
      int index;
      long sum = 0;

      for (int j = 0; j <= 82; j++) 
      {

            if (prep_fibonnaci[j] > N) 

            {
            index = j - 1;
            //cout <<"index: " << index << "\n";
            highest_fib = prep_fibonnaci[index];
            //cout <<"highest_fib: " <<highest_fib <<"\n";
            break;
            }

      }


      for (int k = 2; k <= index; k = k+3) 

      {
            sum = sum+prep_fibonnaci[k];
            //cout << "sum: " << sum << "\n";
      }


       cout << sum << "\n";

    }

    return 0;
}