带符号的高精度数加减

来源:互联网 发布:xp系统usb网络共享驱动 编辑:程序博客网 时间:2024/06/05 20:59

目前只写了加减,乘除以后再补上。

还有构造函数那里,应该考虑输入的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;elsereturn 1;}}elsereturn 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();}


0 0
原创粉丝点击