用户:
不知道该叫啥的一只萌新查看: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注释掉后答案错误,无注释正确
求助!
ParseYPasymain.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
评论