求助结构体类型赋值和构造函数的用法
查看原帖
求助结构体类型赋值和构造函数的用法
490694
Compound_Interest楼主2022/8/7 08:11
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#define int long long
using namespace std;
const int maxn=5e4+10;
bool flag=0;
struct Number{
	int a[maxn],len;
	void cl(){memset(a,0,sizeof(a)),len=1;}
	Number(){cl();}
	Number(const Number &x){
		cl();	//每一个都不要留了cl()
		len=x.len;
		for(int i=0;i<len;i++) a[i]=x.a[i];
	}
	Number(string str){
		cl();
		len=str.length();
		for(int i=0;i<str.length();i++){
			a[i]=str[str.length()-1-i]-'0';
		}
	}
	Number(int x){
		cl();
		while(x){
			a[len++]=x%10,x/=10;
		}
	}
};
void print(Number x){
	if(flag) printf("-");
	for(int i=x.len-1;i>=0;i--) printf("%lld",x.a[i]);
	printf("\n");
}
bool operator>=(Number x,Number y){
	if(x.len>y.len) return 1;
	else if(x.len<y.len) return 0;
	else{
		for(int i=0;i<x.len;i++)
			if(x.a[i]>y.a[i]) return 1;
			else if(x.a[i]<y.a[i]) return 0;
	}
	return 1;
}
Number operator+(Number x,Number y){
	Number ret;
	ret.len=max(x.len,y.len)+1;
	for(int i=0;i<ret.len;i++) ret.a[i]=x.a[i]+y.a[i];
	for(int i=0;i<ret.len;i++){
		ret.a[i+1]+=ret.a[i]/10;
		ret.a[i]%=10;
	}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret;
}
Number operator-(Number x,Number y){
	Number ret,tmp;
	if(y>=x) tmp=x,x=y,y=tmp,flag=1; 
	ret.len=x.len;
	for(int i=0;i<x.len;i++){
		if(x.a[i]<y.a[i]){
			x.a[i]+=10,x.a[i+1]--;
		}
		ret.a[i]=x.a[i]-y.a[i];
	}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret;
}
Number operator*(Number x,Number y){
	Number ret;
	ret.len=x.len+y.len;
	for(int i=0;i<x.len;i++)
		for(int j=0;j<y.len;j++){
			ret.a[i+j]+=x.a[i]*y.a[j];
			ret.a[i+j+1]+=ret.a[i+j]/10;
			ret.a[i+j]%=10;
		}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret;
}
Number operator*(Number x,int y){
	Number ret;
	ret.len=x.len+10ll;
	for(int i=0;i<ret.len;i++){
		ret.a[i]+=x.a[i]*y;
		ret.a[i+1]+=ret.a[i]/10;
		ret.a[i]%=10;
	}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret;
}
Number operator/(Number x,int y){
	Number ret;
	ret.len=x.len;
	int t=0;
	for(int i=x.len-1;i>=0;i--){
		ret.a[i]=(t*10+x.a[i])/y;
		t=(t*10+x.a[i])%y; 
	}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret; 
}
bool dydy(Number x,Number y,int pos){// >=
	if(x.a[pos+y.len]) return 1;
	for(int i=y.len-1;i>=0;i--)
		if(x.a[pos+i]>y.a[i]) return 1;
		else if(x.a[pos+i]<y.a[i]) return 0;
	return 1; 
}
Number operator/(Number x,Number y){
	Number ret,yu=x;
    ret.len=x.len;
	for(int i=x.len-y.len;i>=0;i--){
		while(dydy(yu,y,i)){
			for(int j=0;j<=y.len-1;j++){
				if(y.a[j]>yu.a[i+j]) yu.a[i+j+1]--,yu.a[i+j]+=10;
				yu.a[i+j]-=y.a[j];
			}
			ret.a[i]++;
		}
	}
	while(!ret.a[ret.len-1]&&ret.len>1) ret.len--;
	return ret;
}
signed main(){
	int b;
	string str1,str2;
	cin>>str1>>b;
	Number a=str1;
	print(a*b);
	return 0;
}

这是蒟蒻自己写的重载运算符的高精模板,

蒟蒻有以下问题,向各位神犇请教

请一下几种操作可不可行

//我已经写好的构造函数
struct Number{
	int a[maxn],len;
	void cl(){memset(a,0,sizeof(a)),len=1;}
	Number(){cl();}
	Number(const Number &x){
		cl();	//每一个都不要留了cl()
		len=x.len;
		for(int i=0;i<len;i++) a[i]=x.a[i];
	}
	Number(string str){
		cl();
		len=str.length();
		for(int i=0;i<str.length();i++){
			a[i]=str[str.length()-1-i]-'0';
		}
	}
	Number(int x){
		cl();
		while(x){
			a[len++]=x%10,x/=10;
		}
	}
};
在定义Number类型的变量时直接用等号赋值

Number x=1;

这种操作可行吗 

看到别的地方的写法是这样的

Number x(1);
用已经定义好的Number类型给已经定义好的Number类型变量赋值

Number a=1,b=;

a=b;

这种操作会把b中结构体所有变量数组之类的赋值给a吗

3.这种写法可行吗

#include<queue>
struct node{
	int x,y;
   node(int x_.int y_){
	x=x_,y=y_;
   }
   node(){}
queue<node>q;
int main(){
 q.push(node(1,1))//这里可行吗
 return 0;
}
}
2022/8/7 08:11
加载中...