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