Вывод на компилятор отличается от ожидаемого значения. Но правильное значение получается при копировании этого значения в Excel - PullRequest
1 голос
/ 28 мая 2019

Вывод, отображаемый в компиляторе, неверен, но при копировании из компилятора и вставке в 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;
}

1 Ответ

1 голос
/ 28 мая 2019

Как вы вычислили массив prep_fibonacci? Значения, начинающиеся с 1304969544928650, неверны - думаю, это ваша проблема.

...