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