gakusei_programmer
@gakusei_programmer

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C++の挙動について

解決したいこと

AtCoderの以下の問題の答えをC++とPythonで同じように解きました。Pythonでは正解できているのですが、C++では間違っていると表示されます。おそらく言語仕様の問題だと思うのですが、C++に詳しい方、ご教授願います。

D - Logical Expression
ソースコードについては、ANDが出た場合は最新の変数は1固定でひとつ前の答えをコピーし、ORが出た場合は最新の変数が1の時2iを追加し、0の時は同様にひとつ前の答えをコピーしています。

間違っているコード

#include <bits/stdc++.h>
using namespace std;
using ll=long long;

ll N;
int main(){
    cin>>N;
    vector<ll> A(N+1, 0);
    A[0] = 1;
    for(ll i=1; i<=N; i++){
        string S;
        cin>>S;
        if(S=="AND"){
            A[i] = A[i-1];
        }
        else {
            A[i] = A[i-1] + (1<<i);
        }
    }
    cout<<A[N]<<endl;
}

問題がないコード

N = int(input())

A = [0]*(N+1)
A[0] = 1
for i in range(1, N+1):
    S = input()
    if(S=="AND"):
        A[i]=A[i-1]
    else:
        A[i] = A[i-1] + (1<<i)
print(A[N])

自分で試したこと

オーバーフロー対策はしてあります。Pythonで解けたので解き方自体は間違ってはいないと思います。

0

1Answer

問題点は 1<<i だと思います。 C++ の言語仕様ではこの式の結果の型は左オペランド (を汎整数昇格した後) の型、つまりこの場合には int になるルールです。 また、右オペランドの値が結果の型の幅以上か負の場合の結果は未定義です。 (詳細な規則は言語仕様をご覧ください。)

1 の替わりに 1LL と書くべきです。

2Like

Comments

  1. なるほど!分かった気がします。1がint型として認識されているせいで計算結果がintになってしまっているということですね!

Your answer might help someone💌