您的位置:首页 > 其它

带符号的高精度数加减

2017-04-11 20:37 162 查看
目前只写了加减,乘除以后再补上。

还有构造函数那里,应该考虑输入的string不是数字怎么办.,再写个checkstring就好了。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Interger
{
private:
bool isneg;//正负
int size;//不算正负号,忽略前边的0(应该是这样,但是构造没处理零,不过加减的结果前边没有零),数的长度
string str;
vector<int> vec;//这里边倒序储存着str,用来中转,计算 。
public:
Interger()
{
size = 0;
str = "";
vec.resize(0);
}
Interger(string str)
{
//cout<<"构造"<<endl;
if(str[0] == '+' || str[0] == '-')
{
isneg = (str[0] == '-' ? true:false);
this->size = str.size()-1;
this->str = str.substr(1,str.size()-1);
for(int i=str.size()-1; i>=1; i--)
vec.push_back(str[i] - '0');
}
else
{
this->size = str.size();
isneg = false;
this->str = str;
for(int i=str.size()-1; i>=0; i--)
vec.push_back(str[i] - '0');
}
}
Interger(const Interger &fuck)
{
//cout<<"copy构造"<<endl;
this->isneg = fuck.isneg;
this->size = fuck.size;
this->str = fuck.str;
this->vec.resize(fuck.size);
for(int i=0;i<size;i++)
this->vec[i] = fuck.vec[i];
}
bool bigger(Interger &fuck)
{
if(this->size < fuck.size)
return 0;
else if(this->size == fuck.size)
{
int num = this->size;
for(int i=num-1; i>=0;i--)
{
if(this->vec[i] == fuck.vec[i])
continue;
else if(this->vec[i] < fuck.vec[i])
return 0;
else
return 1;
}
}
else
return 1;
}

Interger& operator=(const Interger &fuck)
{
//cout<<"赋值"<<endl;
if(this == &fuck)
return *this;
this->isneg = fuck.isneg;
this->size = fuck.size;
this->str = fuck.str;
vec.resize(fuck.size);
for(int i=0;i<size;i++)
vec[i] = fuck.vec[i];
return *this;
}
/*
Interger& operator+=(const Interger &fuck)
{
int numsize = max(this->size, fuck.size);
this->vec.resize(numsize+1);
this->str.clear();

for(int i=0; i<numsize; i++)
{
int index = this->vec[i];
if(i <fuck.size)
index += fuck.vec[i];
if(index>=10)
{
this->vec[i+1] += 1;
index -= 10;
}
this->vec[i] = index;
}
for(int i=this->vec.size()-1; i>=0; i--)
this->str.push_back(this->vec[i] + '0');

this->size =this->vec.size();
return *this;
}
*/
Interger operator+(Interger &fuck)
{
if(this->isneg == false && fuck.isneg == true)//负加正
{
Interger temp = fuck;
temp.isneg = false;
return (*this) - temp;
}
else if(this->isneg == true && fuck.isneg == false)//正加负
{
return fuck + (*this);
}

Interger in;
if(this->isneg == true && fuck.isneg == true )//负加负
in.isneg = true;
else if(this->isneg == false && fuck.isneg == false)//正加正
in.isneg = false;
int numsize = max(this->size, fuck.size);
in.vec.resize(numsize+1,0);
for(int i=0; i<numsize+1; i++)
{
int index = in.vec[i];
if(i < this->size)
index += this->vec[i];
if(i <fuck.size)
index += fuck.vec[i];
if(index>=10)
{
in.vec[i+1] = 1;
index -= 10;
}
in.vec[i] = index;
}
for(int i=in.vec.size()-1; in.vec[i] == 0 && i!=0;i--)//处理多余的零
in.vec.pop_back();
for(int i=in.vec.size()-1; i>=0; i--)
{
in.str.push_back(in.vec[i] + '0');
}
in.size =in.vec.size();
return in;
}

Interger operator-(Interger &fuck)
{
if(this->isneg == false && fuck.isneg == true )//正减负
{
Interger temp = fuck;
temp.isneg = false;
return (*this) + temp;
}
else if(this->isneg == true && fuck.isneg == false)//负减正 变为负加负
{
Interger temp = fuck;
temp.isneg = true;
return (*this) + temp;
}
else if(this->isneg == true && fuck.isneg == true)//负减负 变为 正减正
{
Interger temp1 = (*this);
Interger temp2 = fuck;
temp1.isneg = false;
temp2.isneg = false;
return temp1 - temp2;
}
Interger in;
if(bigger(fuck))
in.isneg = false;
else
{
Interger temp = fuck-(*this);
temp.isneg = true;
return temp;
}
int numsize = max(this->size, fuck.size);
in.vec.resize(numsize,0);
for(int i=0; i<numsize; i++)
{
int index = in.vec[i];
if(i < this->size)
index += this->vec[i];
if(i <fuck.size)
index -= fuck.vec[i];
if(index<0)
{
in.vec[i+1] = -1;
index += 10;
}
in.vec[i] = index;
//cout<<"in.vec[i]"<<in.vec[i];
}

for(int i=in.vec.size()-1; in.vec[i] == 0 && i!=0;i--)//处理多余的零
in.vec.pop_back();
for(int i=in.vec.size()-1; i>=0; i--)
{
in.str.push_back(in.vec[i] + '0');
}
in.size =in.vec.size();
return in;
}

void display()
{
if(this->isneg == true)
cout<<"-";
cout<<this->str<<endl;
}
} ;

int main()
{
string s1, s2;
cin>>s1>>s2;
Interger fuck1;
Interger temp(s1);
fuck1 = temp;
Interger fuck2(s2);

//fuck1.operator+=(fuck2);
//fuck1.display();
temp = fuck1+fuck2;
temp.display();

(fuck1-fuck2).display();
//temp.display();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: