2016-06-30 2 views
0

, пожалуйста, помогите решить эту основную проблему. Я получил вопрос ниже.Работа с функцией в C++

Вычислить модуль целых чисел А и В, чтобы 1000000007, используя функцию F (A, B, N), как описано ниже, с помощью C++ с 0 < = N < = 1000000000.

Modulus of F[A, B, 0] is equal to A%1,000,000,007 
Modulus of F[A, B, 1] is equal to B%1,000,000,007 
Modulus of F[A, B, N] is equal to modulus of F[A, B, N - 1] + F[A, B, N - 2] 

Example, Modulus of F[3, 4, 5] is equal to 29. In detail: 

Modulus of F[3, 4, 0] is equal to 3%1,000,000,007 which is 3 

Modulus of F[3, 4, 1] is equal to 4%1,000,000,007 which is 4 

Modulus of F[3, 4, 2] is equal to modulus of F[3, 4, 1] + F[A, B, 0] which is 3 + 4 = 7 

Modulus of F[3, 4, 3] is equal to modulus of F[3, 4, 2] + F[A, B, 1] which is 7 + 4 = 11 

Modulus of F[3, 4, 4] is equal to modulus of F[3, 4, 3] + F[A, B, 2] which is 11 + 7 = 18 

Modulus of F[3, 4, 5] is equal to modulus of F[3, 4, 4] + F[A, B, 3] which is 18 + 11 = 29 

я использовал Xcode и Mac OS X и вот мой код.

#include <iostream> 
#include <vector> 

int solution(int A, int B, int N) 
{ 
    std::vector<int> remainderVector; 

    if (N < 0 || N > 1000000000) 
    { 
     std::cout << "N is out of range." << std::endl; 
    } 

    if (N == 0) 
    { 
     remainderVector[N] = A%1000000007; 
    } 

    if (N == 1) 
    { 
     remainderVector[N] = B%1000000007; 
    } 

    if (N > 1 && N <= 1000000000) 
    { 
     remainderVector[0] = A%1000000007; 
     remainderVector[1] = B%1000000007; 

     for (int i = 2; i <= N; i++) 
     { 
      remainderVector[i] = remainderVector[i - 1] + remainderVector[i - 2]; 
     } 
    } 

    std::cout << "Remainder is: " << remainderVector[N] << std::endl; 

    return 0; 
} 

int main() 
{ 
    std::cout << "Input A interger: " << std::endl; 
    int x; 
    std::cin >> x; 

    std::cout << "Input B interger: " << std::endl; 
    int y; 
    std::cin >> y; 

    std::cout << "Input Z interger: " << std::endl; 
    int z; 
    std::cin >> z; 

    int solution(int x, int y, int z); 

    std::cout << "This is a debug message." << std::endl; 
    return 0; 
} 

Когда я запустил этот код, это просто появилось сообщение: Это сообщение об отладке. Почему он не распечатывал номер 29, когда я вводил пример 3, 4, 5, как объяснялось выше.

Большое спасибо за помощь.

+3

Вы отлаживали свою программу? –

+0

Ваш вызов «решения» - это объявление прототипа, а не вызов функции. Попробуйте «решение (x, y, z)»; Я удивлен, что это сложно. – Tezirg

+0

Спасибо, я изменил решение (x, y, z), и он работает, когда я также объявляю размер вектора N + 1. Большое спасибо. –

ответ

0

Ваш remainderVector изначально пуст, поэтому вы не можете назначать произвольные элементы внутри него (так как они не существуют). Изменение:

std::vector<int> remainderVector; 

в

std::vector<int> remainderVector(N + 1); 

Также обратите внимание, что логика в оставшемся коде выглядит немного запутанным и имеет некоторую избыточность. Фиксированная/упрощенная версия будет:

remainderVector[0] = A%1000000007; // set element 0 

if (N > 0)       // set element 1 
{ 
    remainderVector[1] = B%1000000007; 
} 

for (int i = 2; i <= N; i++)  // set elements 2..N 
{ 
    remainderVector[i] = remainderVector[i - 1] + remainderVector[i - 2]; 
} 
+0

Я изменил размер вектора на N + 1, и он работает. Я не ставил размер вектора, потому что объясняется, что вектор может автоматически понять его размер или не нужно указывать его размер при запуске. Вот ссылка, которую я изучил http://www.learncpp.com/cpp-tutorial/6-16-an-introduction-to-stdvector/. –

+0

'std :: vector' будет автоматически увеличиваться в размере, если вы используете, например. 'push_back', чтобы добавить элемент, но вы не можете просто случайным образом индексировать его выше своего текущего размера и ожидать, что он автоматически вырастет, чтобы соответствовать этому. –

+1

Привет, Пол, теперь я понимаю, что «он не способен индексировать вектор случайно за пределами его текущего размера», как вы объяснили. Спасибо, что научили меня push_back. В приведенной выше ссылке вы увидите, что автор никогда не указывает размер вектора. В вашем коде для установки элемента 0, элемента 1 и элемента i вы не использовали push_back. Это действительно беспорядок для меня. Кстати, я выучил хороший урок. Большое спасибо Пол. –