社区讨论
为什么会报错 ?
灌水区参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo15t8wv
- 此快照首次捕获于
- 2023/10/22 15:40 2 年前
- 此快照最后确认于
- 2023/11/02 15:15 2 年前
这段代码在Dev-c++会跳到
stl_algobase.h库报错 , 看图片
代码:
CPP#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int MAX = 1010;
const double pai = acos(-1);
struct com
{
double r,i;
com(double a = 0,double b = 0):r(a),i(b){}
};
com operator+(com a,com b)
{
return {a.r + b.r,a.i + b.i};
}
com operator-(com a,com b)
{
return {a.r - b.r,a.i - b.i};
}
com operator*(com a,com b)
{
return {a.r * b.r - a.i * b.i,a.r * b.i + a.i * b.r};
}
string a,b;
int n = 1,len,tot[MAX]; // MAX为const型 , 代表数组最大大小
com A1[MAX],B1[MAX];
void FFT(com *X,int type)
{
for(int i = 0;i < n;i++)
if(i < tot[i])
swap(X[i],X[tot[i]]);
for(int i = 1;i < n;i <<= 1)
{
com x(cos(pai / i),type * sin(pai / i));
for(int j = 0;j < n;j += (i << 1))
{
com y(1,0);
for(int k = 0;k < i;k++)
{
com a1 = X[j + k],a2 = y * X[i + j + k];
X[j + k] = a1 + a2;
X[i + j + k] = a1 - a2;
y = y * x;
}
}
}
}
int A[1010],B[1010],C[1010];
typedef unsigned long long ull;
// 提示:
// 本高精度结构体使用模拟的方式去做加、减、
// 除的计算。例如加法:一位一位加,然后再
// 进位。乘法使用 FFT的方法进行运算。
// 高精度结构体:
struct vli
{
// vli 为 very_long_int 的缩写
vector <char> number,last; // 没办法,只能用vector存
int length;
void save() // 保存现在的数字
{
last = number;
}
void load() // 加载保存的数字
{
number = last;
}
void get_string(string s) // 获取string
{
for(int i = 0;i < s.size();i++)
number.push_back(s[i]);
}
void show() // 输出数字
{
for(int i = 0;i < number.size();i++)
cout << number[i];
cout << '\n';
}
};
// 现在要重载运算符+,-,*,/,<,<=,>,>=,==
bool operator<(const vli a,const vli b)
{
if(a.number.size() != b.number.size())
return a.number.size() < b.number.size();
for(int i = 0;i < a.number.size();i++)
if(a.number[i] != b.number[i])
return a.number[i] < b.number[i];
return false;
}
bool operator<=(const vli a,const vli b)
{
if(a.number.size() != b.number.size())
return a.number.size() <= b.number.size();
for(int i = 0;i < a.number.size();i++)
if(a.number[i] != b.number[i])
return a.number[i] <= b.number[i];
return true;
}
bool operator>(const vli a,const vli b)
{
if(a.number.size() != b.number.size())
return a.number.size() > b.number.size();
for(int i = 0;i < a.number.size();i++)
if(a.number[i] != b.number[i])
return a.number[i] > b.number[i];
return false;
}
bool operator>=(const vli a,const vli b)
{
if(a.number.size() != b.number.size())
return a.number.size() > b.number.size();
for(int i = 0;i < a.number.size();i++)
if(a.number[i] != b.number[i])
return a.number[i] >= b.number[i];
return true;
}
bool operator==(const vli a,const vli b)
{
if(a.number.size() != b.number.size())
return false;
for(int i = 0;i < a.number.size();i++)
if(a.number[i] != b.number[i])
return false;
return true;
}
vli operator+(const vli a,const vli b)
{
vli ans;
int lena = a.number.size(),lenb = b.number.size();
int len = max(lena,lenb);
for(int i = lena - 1;i >= 0;i--)
A[lena - i] = a.number[i] - '0';
for(int i = lenb - 1;i >= 0;i--)
B[lenb - i] = b.number[i] - '0';
for(int i = 1;i <= len;i++)
{
C[i] += (A[i] + B[i]);
C[i + 1] = C[i] / 10;
C[i] %= 10;
}
if(C[len + 1])
len++;
for(int i = len;i >= 1;i--)
ans.number.push_back(C[i] + '0');
for(int i = 0;i < 1010;i++)
A[i] = 0,B[i] = 0,C[i] = 0;
return ans;
}
vli operator-(const vli a,const vli b)
{
vli ans;
int lena = a.number.size(),lenb = b.number.size();
int len = max(lena,lenb);
for(int i = lena - 1;i >= 0;i--)
A[lena - i] = a.number[i] - '0';
for(int i = lenb - 1;i >= 0;i--)
B[lenb - i] = b.number[i] - '0';
for(int i = 1;i <= len;i++)
C[i] = A[i] - B[i];
for(int i = 1;i <= len;i++)
{
if(C[i] < 0)
C[i + 1]--,C[i] += 10;
}
int l = len;
for(int i = len;i >= 1;i--)
{
if(C[i] != 0)
break;
else
l--;
}
for(int i = l;i >= 1;i--)
ans.number.push_back(C[i] + '0');
for(int i = 0;i < 1010;i++)
A[i] = 0,B[i] = 0,C[i] = 0;
return ans;
}
vli operator*(const vli a,const vli b)
{
vli ans;
reverse(a.number.begin(),a.number.end());
reverse(b.number.begin(),b.number.end());
while(n <= a.number.size() + b.number.size())
{
n <<= 1;
len++;
}
for(int i = 0;i < n;i++)
tot[i] = ((tot[i >> 1] >> 1) | ((i & 1) << (len - 1)));
for(int i = 0;i < a.number.size();i++)
A1[i] = {a.number[i] - '0',0};
for(int i = 0;i < b.number.size();i++)
B1[i] = {b.number[i] - '0',0};
FFT(A1,1);
FFT(B1,1);
for(int i = 0;i < n;i++)
A1[i] = A1[i] * B1[i];
FFT(A1,-1);
for(int i = 0;i < n;i++)
{
C[i] += (int)(A1[i].r / n + 0.5);
C[i + 1] = C[i] / 10;
C[i] %= 10;
}
while(!C[n])
n--;
for(int i = n;i >= 0;i--)
ans.number.push_back(C[i] + '0');
for(int i = 0;i < 1010;i++)
C[i] = 0;
return ans;
}
vli operator/(const vli a,const vli b)
{
vli ans,i,x;
i.get_string("1");
x.get_string("1");
if(a.number[0] == '0' && a.number.size() == 1)
return ans;
for(;i * b <= a;i = i + x)
if(i * b == a)
return i;
return i - x;
}
vli operator%(const vli a,const vli b)
{
return a - a / b;
}
int main()
{
vli n1,n2,ans;
string a,b;
char op;
cin >> a >> b >> op;
n1.get_string(a);
n2.get_string(b);
switch(op)
{
case '+':
ans = n1 + n2;
break;
case '-':
ans = n1 - n2;
break;
case '*':
ans = n1 * n2;
break;
case '/':
ans = n1 / n2;
break;
case '%':
ans = n1 % n2;
break;
}
ans.show();
return 0;
}
请求帮忙看一下 , 蒟蒻
回复
共 9 条回复,欢迎继续交流。
正在加载回复...