С ++ несколько вложенных операторов If-else работают, но объединение - нет - PullRequest
0 голосов
/ 06 мая 2020

Я новичок ie в c ++. Я попытался задать вопросы, связанные с битовыми наборами (https://www.codechef.com/problems/CHEFQUE), когда я использую следующие вложенные операторы, код проходит все тесты

    for(int i=1;i<Q+1;i++){
        temp = S/2;
        if(S&1){ //odd
            if(!sets[temp]){
                sets[temp] = true;
                sum+=temp;
            }
        }
        else{    //even
            if(sets[temp]){
                sets[temp] = false;
                sum-=temp;
            }
        }
        S = (A*S + B);

Но когда я объединяю несколько if-else утверждений, он терпит неудачу на некоторых тестах

    for(int i=1;i<Q+1;i++){
        temp = S/2;
        if(S&1 && !sets[temp]){ //odd and empty
            sets[temp] = true;
            sum+=temp;
        }
        else if(!S&1 && sets[temp]){    //even ond occupied
            sets[temp] = false;
            sum-=temp;
        }
        S = (A*S + B);
    }

Я действительно понятия не имею, почему это могло произойти, я уверен, что это должно быть действительно глупо. Я был бы очень благодарен, если бы кто-нибудь помог.

1 Ответ

1 голос
/ 06 мая 2020

Как видно из этой таблицы , оператор ! имеет более высокий приоритет, чем & (побитовый, а не адрес), поэтому ваш код должен выглядеть так:

    for(int i=1;i<Q+1;i++){
    temp = S/2;
    if(S&1 && !sets[temp]){ //odd and empty
        sets[temp] = true;
        sum+=temp;
    }
    else if(!(S&1) && sets[temp]){    //even ond occupied
        sets[temp] = false;
        sum-=temp;
    }
    S = (A*S + B);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...