猫史档案馆


[C++类/重载运算符]求助

用户:不知道该叫啥的一只萌新不知道该叫啥的一只萌新查看:8 回复:2 评论:8 创建时间:2022-04-29T08:26:44


各位C++的大佬们来看看

我写了个高精度类:

#include <bits/stdc++.h>
using namespace std;
class haa{
public:
	haa(long long num=0){
		string n=to_string(num);
		for(int i=n.length()-1;i>=0;--i) A.push_back(n[i]-'0');
	}
	friend istream& operator>>(istream &is,haa &n);
	friend ostream& operator<<(ostream &os,const haa &n);
	int operator[](long long index) const;
	bool operator<(haa &B);
	haa operator+(haa &B);
	haa operator+(int &B);
	haa operator+=(haa &B);
	haa operator-(haa &B);
	haa operator-=(haa &B);
	haa operator*(haa &B);
	haa operator/(haa &B);
	
	int size(){return (int)A.size();}
	void setvalue(vector<int> C){A=C;}
	void push_back(int a){A.push_back(a);}
	int back(){return A.back();}
	vector<int> value(){return A;}
	void rlz(){
		while(A.size()>1&&A.back()==0) A.pop_back();
	}
private:
	vector<int> A;
};
haa& ihaasub(haa A,int B=1){
	vector<int> C;
	for(int i=0,t=0;i<A.size();i++){
		t=A[i]-t;
		if(i<1) t-=1;
		C.push_back((t+10)%10);
		if(t<0) t=1;
		else t=0;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
istream& operator>>(istream &is,haa &n){
	string s;
	is>>s;
	n.A.clear();
	for(int i=s.length()-1;i>=0;--i) n.A.push_back(s[i]-'0');
	return is;
}
ostream& operator<<(ostream &os,const haa &n){
	if(n.A.empty()) os<<0;
	for(int i=n.A.size()-1;i>=0;--i) os<<n[i];
	return os;
}
int haa::operator[](long long index)const{
	return A[index];
}
bool haa::operator<(haa &B){
	if(A.size()>B.size()) return false;
	if(A.size()<B.size()) return true;
	for(int i=A.size()-1;i>=0;i++){
		if(A[i]==B[i]) continue;
		else if(A[i]<B[i]) return true;
		else return false;
	}
	return false;
}
haa haa::operator+(haa &B){
	if(A.size()<B.size()){
		vector<int> C;
		int t=0;
		for(int i=0;i<B.size();i++){
			t+=B[i];
			if(i<A.size()) t+=A[i];
			C.push_back(t%10);
			t/=10;
		}
		if(t!=0) C.push_back(t);
		haa c;
		c.setvalue(C);
		c.rlz();
		return c;
	}else{
		vector<int> C;
		int t=0;
		for(int i=0;i<A.size();i++){
			t+=A[i];
			if(i<B.size()) t+=B[i];
			C.push_back(t%10);
			t/=10;
		}
		if(t!=0) C.push_back(t);
		haa c;
		c.setvalue(C);
		c.rlz();
		return c;
	}	
}
haa haa::operator+(int &B){
	string b=to_string(B);
	
}
haa haa::operator+=(haa &B){
	*this=*this+B;
	return *this;
}
haa haa::operator-(haa &B){
	vector<int> C;
	for(int i=0,t=0;i<A.size();i++){
		t=A[i]-t;
		if(i<B.size()) t-=B[i];
		C.push_back((t+10)%10);
		if(t<0) t=1;
		else t=0;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
haa haa::operator-=(haa &B){
	*this=*this-B;
	return *this;
}
haa haa::operator*(haa &B){
	vector<int> C(A.size()+B.size());
	for(int i=0;i<A.size();i++){
		for(int j=0;j<B.size();j++){
			C[i+j]+=A[i]*B[j];
		}
	}
	for (int i=0,t=0;i<C.size()||t;i++){
		t+=C[i];
		if(i>=C.size()) C.push_back(t % 10);
		else C[i]=t%10;
		t/=10;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
haa haa::operator/(haa &B){
	haa s;
	while(*this<B){
		B-=*this;
	//	s=s+1;
	}
	return s;
}
haa pow(haa &A,haa &B){
	haa k=haa(1);
	B.rlz();
	k.rlz();
	if(B<k) return 1;
	haa D=B-k;
	haa C=pow(A,D);
	//cout<<"pow("<<A<<","<<D<<")="<<A*C<<"\n";
	return A*C;
}
int main(){
	haa sum;
	haa n;
	cin>>n;
	haa c=haa(2);
	haa ans=pow(c,n);
	c=haa(2);
	cout<<ans;
	return 0;
}

在1喵行的cout注释掉后答案错误,无注释正确

求助!


回复

上一页1 页 / 共 1下一页
我是菜鸟啊我是菜鸟啊

你换成printf试试

点赞0


评论


ParseYPasyParseYPasy

main.cpp:45:9: warning: reference to stack memory associated with local variable 'c' returned [-Wreturn-stack-address]
        return c;
               ^
main.cpp:106:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
2 warnings generated.

这是gcc的警告

显然你的ihaasub返回的是haa的引用,但你返回的是一个正常的临时类,把haa&改成haa就行了

以及106行的operator+没写完整

106的实现你还没写完,我先返回个构造函数代替,解决代码如下:

#include <bits/stdc++.h>
using namespace std;
class haa{
public:
	haa(long long num=0){
		string n=to_string(num);
		for(int i=n.length()-1;i>=0;--i) A.push_back(n[i]-'0');
	}
	friend istream& operator>>(istream &is,haa &n);
	friend ostream& operator<<(ostream &os,c喵t haa &n);
	int operator[](long long index) c喵t;
	bool operator<(haa &B);
	haa operator+(haa &B);
	haa operator+(int &B);
	haa operator+=(haa &B);
	haa operator-(haa &B);
	haa operator-=(haa &B);
	haa operator*(haa &B);
	haa operator/(haa &B);
	
	int size(){return (int)A.size();}
	void setvalue(vector<int> C){A=C;}
	void push_back(int a){A.push_back(a);}
	int back(){return A.back();}
	vector<int> value(){return A;}
	void rlz(){
		while(A.size()>1&&A.back()==0) A.pop_back();
	}
private:
	vector<int> A;
};
haa ihaasub(haa A,int B=1){
	vector<int> C;
	for(int i=0,t=0;i<A.size();i++){
		t=A[i]-t;
		if(i<1) t-=1;
		C.push_back((t+10)%10);
		if(t<0) t=1;
		else t=0;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
istream& operator>>(istream &is,haa &n){
	string s;
	is>>s;
	n.A.clear();
	for(int i=s.length()-1;i>=0;--i) n.A.push_back(s[i]-'0');
	return is;
}
ostream& operator<<(ostream &os,c喵t haa &n){
	if(n.A.empty()) os<<0;
	for(int i=n.A.size()-1;i>=0;--i) os<<n[i];
	return os;
}
int haa::operator[](long long index)c喵t{
	return A[index];
}
bool haa::operator<(haa &B){
	if(A.size()>B.size()) return false;
	if(A.size()<B.size()) return true;
	for(int i=A.size()-1;i>=0;i++){
		if(A[i]==B[i]) continue;
		else if(A[i]<B[i]) return true;
		else return false;
	}
	return false;
}
haa haa::operator+(haa &B){
	if(A.size()<B.size()){
		vector<int> C;
		int t=0;
		for(int i=0;i<B.size();i++){
			t+=B[i];
			if(i<A.size()) t+=A[i];
			C.push_back(t%10);
			t/=10;
		}
		if(t!=0) C.push_back(t);
		haa c;
		c.setvalue(C);
		c.rlz();
		return c;
	}else{
		vector<int> C;
		int t=0;
		for(int i=0;i<A.size();i++){
			t+=A[i];
			if(i<B.size()) t+=B[i];
			C.push_back(t%10);
			t/=10;
		}
		if(t!=0) C.push_back(t);
		haa c;
		c.setvalue(C);
		c.rlz();
		return c;
	}	
}
haa haa::operator+(int &B){
	string b=to_string(B);
	return haa();
}
haa haa::operator+=(haa &B){
	*this=*this+B;
	return *this;
}
haa haa::operator-(haa &B){
	vector<int> C;
	for(int i=0,t=0;i<A.size();i++){
		t=A[i]-t;
		if(i<B.size()) t-=B[i];
		C.push_back((t+10)%10);
		if(t<0) t=1;
		else t=0;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
haa haa::operator-=(haa &B){
	*this=*this-B;
	return *this;
}
haa haa::operator*(haa &B){
	vector<int> C(A.size()+B.size());
	for(int i=0;i<A.size();i++){
		for(int j=0;j<B.size();j++){
			C[i+j]+=A[i]*B[j];
		}
	}
	for (int i=0,t=0;i<C.size()||t;i++){
		t+=C[i];
		if(i>=C.size()) C.push_back(t % 10);
		else C[i]=t%10;
		t/=10;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	haa c;
	c.setvalue(C);
	c.rlz();
	return c;
}
haa haa::operator/(haa &B){
	haa s;
	while(*this<B){
		B-=*this;
	//	s=s+1;
	}
	return s;
}
haa pow(haa &A,haa &B){
	haa k=haa(1);
	B.rlz();
	k.rlz();
	if(B<k) return 1;
	haa D=B-k;
	haa C=pow(A,D);
	cout<<"pow("<<A<<","<<D<<")="<<A*C<<"\n";
	return A*C;
}
int main(){
	haa sum;
	haa n;
	cin>>n;
	haa c=haa(2);
	haa ans=pow(c,n);
	c=haa(2);
	cout<<ans;
	return 0;
}

下面是输入10的输出:

10
pow(2,1)=2
pow(2,2)=4
pow(2,3)=8
pow(2,4)=16
pow(2,5)=32
pow(2,6)=64
pow(2,7)=128
pow(2,8)=256
pow(2,9)=512
512

如果可以的话,请使用c喵t haa&以减少复制构造的开销,不要轻易用引用做返回类型

点赞0


评论