Вывод, отображаемый в компиляторе, неверен, но при копировании из компилятора и вставке в Ms Excel он волшебным образом выглядит как правильный вывод. какие могут быть причины для этого и как я могу исправить эту проблему.
Я решаю проект Euler # 2 на HackerRank. Задача требует суммирования четного числа Фибоначчи под заданным пределом. Я прошел все тестовые случаи, кроме тестового примера 3. Проходя через обсуждения, я понял, что из-за использования арифметических операций с очень большими числами это может вызывать проблему. Поэтому я взял заданное граничное условие N = 4 * 10 ^ 16 и получил решение с помощью своего кода и сравнил ответ с вычисленным вручную ответом в excel.
ожидаемый ответ (Excel):
49597426547377700
, тогда как вывод компилятора (HackerRank):
49597426547377738
Все стало интересно, когда я скопировал вывод компилятора в 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;
}