为什么执行以下函数会产生运行时错误:来自Abort(3)的Abort信号(SIGABRT)


**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;
}

如何使用map正确重写对不起,如果已经问过这个问题,我在浏览时无法理解

更正了行中缺少的括号:

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

尽管如此,对于范围为10^5的N值,它的幂超出了10^10和10^20s的范围,这就是为什么它在编译器的公差限制后被中止的原因。目前,在C++中还没有能够处理那么多值的数据类型。请参阅执行时间和输出。尝试优化您的代码或为您的问题找到另一种算法。对于较小的N值,如N=10005,程序执行成功。

TIO编译器:在线试用!

Ideone:演示-Ideone在线编译器

您可以尝试的另一种解决方案是以字符串格式存储整数,对于较大的字符串大小,这将花费大量的计算时间,但可以很容易地在加法和小乘法方面进行乘法优化。

相关内容

  • 没有找到相关文章

最新更新