社区讨论

为什么会报错 ?

灌水区参与者 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;
}
请求dalaodalao帮忙看一下 , 蒟蒻QQLQQL

回复

9 条回复,欢迎继续交流。

正在加载回复...