Как исправить ошибку во время выполнения на сите, ошибка времени выполнения подписана целочисленным переполнением: 46349 * 46349? - PullRequest
0 голосов
/ 27 февраля 2020

Когда я пытаюсь использовать sieve, он выдает «ошибку времени выполнения: целочисленное переполнение со знаком: 46349 * 46349 не может быть представлено в типе int для long long int j = i * i; строка .. но переменная j уже длинная длинная int, а не int, почему она все еще дает мне ошибку?

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

bool Eliminated[1000001];
int N;

void Sieve(){
    Eliminated[1]=true;
    for(int i = 2;i<=1000000;i++){
        if(Eliminated[i]==false){
            long long int j = i*i;
            while(j<=1000000){
                Eliminated[j]=true;
                j=j+i;
            }
        }
    }
}

int main(){
    Sieve();
    cin>>N;
    long long int arr[N];
    for(int i = 0;i<N;i++){
        cin>>arr[i];
        long long int temp = sqrt(arr[i]);
        if(temp*temp==arr[i]){
            if(Eliminated[temp]==false){
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }else{
            cout<<"NO"<<endl;
        }
    }
}

1 Ответ

1 голос
/ 27 февраля 2020

Для типа "long long" существует установленное требование минимальной длины - long long int должно быть не меньше long "long". Это не выполняется на каждой итерации в пределах l oop (2 * 2 = 4 не соответствует минимальному требованию).

Не стесняйтесь просматривать эту страницу для получения более подробной информации.

В чем разница между "long", "long long", "long int" и "long long int" в С ++?

...