Почему значение переменной, которая служит в качестве «счетчика», не сбрасывается в ноль, когда циклы повторяются? - PullRequest
0 голосов
/ 06 апреля 2020

Это код, который я написал, и я даю вам примеры входов и выходов для этого, чтобы еще больше прояснить мой вопрос

Пример ввода

2 (значение t, которое это тестовые случаи)
3 (количество входов)

2 4 2

3
0 2 3

Я получаю вывод как

1
1

Я должен получить вывод как

1
0

#include<iostream>
#include<vector>
#define ll long long
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
    vector<ll int> x;
    ll int n;
    cin >> n;
    ll int i, ent;
    for (i = 0; i < n; i++)
    {
        cin >> ent;
        x.push_back(ent);
    }

    vector<ll int>::iterator y,z;
    for(y=(x.begin());y!=(x.end()-1);y++)
        for (z = (x.begin() + 1); z != (x.end()); z++)
        {
            int count=0;
            if (*y + *z == *y * (*z))
                count++;
        }
    cout << count<<endl;
}
return 0;

}

Обновленный код: Но все еще с той же проблемой

    #include<iostream>
    #include<vector>
    #define ll long long
    int main()
    { 
    int t;
    std ::cin >> t;
    while (t--)
    {
    std :: vector<ll int> x;
    ll int n;
    std :: cin >> n;
    ll int i, ent;
    for (i = 0; i < n; i++)
    {
        std :: cin >> ent;
        x.push_back(ent);
    }

    std::vector<ll int>::iterator y,z;

    int count = 0;
    for(y=(x.begin());y!=(x.end()-1);y++)
        for (z = (x.begin()+1); z != (x.end()); z++)
        {
            if (*y + *z == *y * (*z))
                count++;
        }
    std ::cout << count<< std ::endl;
}
return 0;

}

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Ваша первая проблема - доступ к переменной count вне ее области действия. Он объявлен в области видимости внутреннего for() l oop, и вы пытаетесь распечатать его вне его. Переместите свою декларацию выше for() loops

Теперь, чтобы ответить на ваш вопрос. Во второй итерации while() l oop (вектор 0, 2, 3) в одной из итераций for() циклов *x и *z будут равны 2. Что вы должны иметь сделано, чтобы избежать этого, чтобы инициализировать z как z = y + 1

0 голосов
/ 06 апреля 2020

Ваш код, как написано, должен выдавать этот вывод (если он даже соответствует ...) g ++ не скомпилирует его, потому что вы подсчитываете число ссылок после l oop, в котором он был создан. Count ограничен этим l oop поэтому он не существует снаружи. В любом случае, я предполагаю, что вы используете некоторые переключатели компилятора или компилятор, который позволяет это.

Вы фактически составляете один список чисел и через него l oop проверяете закодированное математическое отношение (ie, когда два сложенных числа совпадают с их умножением.) Ваш первый l oop переходит от первого значения ко второму последнему значению (потому что вы проверяете равенство с end () - 1) Я не уверен, действительно ли вы этого хотели или нет. Ваш второй l oop начинается со второго значения, а затем продолжается до последнего значения. Итак, во втором тестовом примере ваше второе число 2 и 2 будет использоваться для параметра * y, а затем это первое значение во втором l oop, поэтому вы выполняете проверку с помощью 2, 2 и 2 + 2. == 4 == 2 * 2, чтобы проверка прошла успешно и счет увеличился. Попробуйте приведенный ниже код, чтобы получить представление о том, что вы делаете (обратите внимание, что я удалил декларацию count из l oop и переместил ее чуть выше объявления y и z, что было необходимо для его компиляции с помощью моя система):

{
    cout << "y:" << *y <<" z:" << *z << endl;
    if (*y + *z == *y * (*z)){
        cout << "match " << *y << " " << *z << endl;
        count++;
        }
}
0 голосов
/ 06 апреля 2020

Конфликт имен между std::count и вашим локальным count. Удалите using namespace std;, и вы получите более значимое сообщение об ошибке: в качестве неизвестного идентификатора count, поскольку count должно быть объявлено вне l oop:

int count=0;
for(y=(x.begin());y!=(x.end()-1);y++)
    for (z = (x.begin() + 1); z != (x.end()); z++)
    {
         if (*y + *z == *y * (*z))
            count++;
     }
std::cout << count << std::endl;

Примечание: std::cout << function_name выходы 1 с неявным преобразованием bool.

Примечание: logi c самого кода все еще может иметь проблемы

...