Member 12566145 Ответов: 5

Почему мой код C++ не работает


Привет
Мой код c++ не работает
В моей программе нет ошибок компиляции.
Несколько строк моего кода, которые просят пользователя поставить значение T A и B, работают, но есть выход

В основном мой код состоит в том, чтобы получить GCD (A,B)

Я использовал отладчик, но не могу найти этот недостаток.
Единственное, что я могу найти, это то, что после обратной(строка 27) функции есть какая-то ошибка.

Что я уже пробовал:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Divisor(int n,vector<int>vec)
{
    for(int i=1;i<n;i++)>
    {
        if(n%i==0)
        {
            vec.push_back(i);// It will be already sorted ha
        }
    }
}

int main()
{
    vector<int>vec1;
    int T;
    int A;
    int B;
    cin >> T;
    for(int j=0;j<t;++j)>
    {
        cin >> A >> B;

        Divisor(A,vec1);

        reverse(vec1.begin(),vec1.end());//LINE 27

        for(int k=0;k<vec1.size();k++)>
        {
            if(B%vec1.at(k)==0)
            {
                cout << vec1.at(k) << endl;
                break;
            }
        }
    }
}

CPallini

Что такое "реверс"?

Patrice T

Объясните ошибку, которую вы получаете.

5 Ответов

Рейтинг:
20

Jochen Arndt

Вы передаете вектор по значению вашему Divisor функция:

void Divisor(int n, vector<int> vec)

При вызове функции новый vector экземпляр создается и заполняется данными переданного vector Но содержание пройденного vector не меняется.

Чтобы изменить содержание пройденного vector, передайте его по указателю или ссылке:
void Divisor(int n, vector<int>& vec)


Рейтинг:
2

Member 12346239

Попробуй вот это...

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Divisor(int n,vector<int>&vec)
{
    for(int i=n;i>0;i--)
    {
        if(n%i==0)
        {
            vec.push_back(i);            
        }
    }   
}
 
int main()
{
    vector<int>vec1;
    int T;
    int A;
    int B;
    cin >> T;
    for(int j=0;j<t;++j)>
    {
        cin >> A >> B; 
       Divisor(A,vec1);
        for(int k=0;k<vec1.size();k++)>
        {
            if(B%vec1.at(k)==0)
            {
                cout << vec1.at(k) << endl;
                break;
            }
        }
    }
}


Richard MacCutchan

Если вы собираетесь отправить код, то, пожалуйста, отформатируйте его должным образом.

Leo Chapiro

Разве это не то же самое, что произошло Йохен Арндт в своем решении 3?

Рейтинг:
0

OriginalGriff

"есть какая - то ошибка" ничего нам не говорит-что-то может произойти, и мы понятия не имеем, что именно! Сказать это-все равно что сломать машину у черта на куличках, а потом, позвонив в гараж, просто сказать: "она сломалась!" - и закончить разговор. Как вы думаете, сколько времени вы будете ждать, прежде чем они прибудут с нужными частями?

Так что используйте отладчик.
Поставьте точку останова в начале функции, запустите приложение в отладчике и шагайте через каждую строку по очереди. Используйте отладчик, чтобы посмотреть, что находится в какой переменной.
Прежде чем выполнять каждую строку, сначала определите, что вы ожидаете, затем выполните строку и посмотрите, что произошло. Это было то, что вы ожидали? Если да, то двигайтесь дальше. Если нет ... а почему бы и нет? Что изменилось? Что случилось, что вы не ожидали, или не произошло, что ты сделал?

Отладка-это навык: вы развиваете его, ТОЛЬКО используя. И гораздо лучше разработать его на таком тривиальном примере кода, как этот, чем на полном проекте в 100 000 строк!
Попробуйте: посмотрите, какую информацию вы можете узнать!


Рейтинг:
0

Patrice T

Способ вычисления GCD сложен и является пустой тратой ресурсов.
Сбор всех делителей числа занимает много времени.

Ошибка: вы забыли, что n-это делитель самого себя !

void Divisor(int n,vector<int>vec)
{
    for(int i=1; i<n>+1; i++)>
    {
        if(n%i==0)
        {
            vec.push_back(i);// It will be already sorted ha
        }
    }
}</n></int>

Наибольший общий делитель - Википедия, свободная энциклопедия[^]

[обновление]
Проблема с вашей программой заключается в том, что чем больше чисел, тем больше времени требуется, чтобы получить ответ. Это O (n).
Правильный способ сделать это-воспользоваться математическим соотношением между 2 числами и GCD.
2 числа кратны GCD, это означает, что разница между 2 числами также кратна GCD.
Это означает, что GCD(A, B) <=> GCD(B, A%B)
Этот
int GCD(int A, int B)
{
    int C;
    C= A % B;
    if (C == 0)
        return B;
    return GCD(B, C);
}

это рекурсивная версия.


Рейтинг:
0