почему выполнение следующей функции дает Runtime Errors: Abort сигнал от abort (3) (SIGABRT)? - PullRequest
0 голосов
/ 10 апреля 2020
   **There is a structure in my program**

    #include<bits/stdc++.h> 
    using namespace std;
    #define N 1000005 
    #define MAX 1e18 
    // Vector to store powers greater than 3 
    vector<long long int> powers; 

    // vector to store perfect squares 
    vector<long long int> squares; 

    void computation()
    { 
     unordered_map<long long int,long long int> mp;
     unordered_map<long long int,long long int> ms;
    squares.push_back(1); 
    ms[1]=1;
    for (long long int i = 2; i <N; i++)  
    { 
        // pushing squares

        squares.push_back(i * i); 
        ms[i*i]=1;
             if (ms[i]==1) 
                continue; 

        long long int temp = i; 

        // run loop until some 
        // power of current number 
        // doesn't exceed MAX 
        while (i * i <= MAX / temp)  
        { 
            temp *= (i * i); 
             if(mp[temp]==0){
            powers.push_back(temp);
            mp[temp]=1;
             }

        } 
    } 
    sort(powers.begin(),powers.end());
    sort(squares.begin(),squares.end());
    } 

в основной функции после вызова функции вычисления любая операция выдает ошибку sig

  int main(){

  computation();

  return 0;

  }

Как правильно переписать это с использованием карты? Извините, если бы этот вопрос уже задавался, я не мог понять, просматривая их.

1 Ответ

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

Исправлены недостающие скобки в строке:

while(i * i <= (MAX / temp)){

Тем не менее, для значения N в диапазоне от 10 ^ 5 его мощности go выходят за пределы диапазона 10 ^ 10 и 10 ^ 20 с, это почему он прерывается после предела допуска компилятора. В настоящее время не существует типа данных, который может обрабатывать столько значений в C ++. Смотрите время выполнения и результаты. Попробуйте оптимизировать свой код или найдите другой алгоритм для вашей проблемы. При небольших значениях N, таких как N = 10005, программа выполняется успешно.

Компилятор TIO: Попробуйте онлайн!

Ideone: Демо-версия - Ideone онлайн-компилятор

Еще одно решение, которое вы можете попробовать, - хранить целые числа в строковых форматах для больших размеров строк, что будет стоить огромного времени вычислений, но может быть легко оптимизировано для умножения с точки зрения сложений и умножения на малые числа. .

...