![]() |
#2
寒风中的细雨2012-10-22 13:07
|

#include <iostream>
#include <string>
#include <deque>
#include <functional>
#include <algorithm>
using namespace std;
class MyBigNum
{
deque<int>v;
public:
MyBigNum(){};
MyBigNum(string strNum)
{
copy(strNum.begin(),strNum.end(),back_inserter(v));
transform(v.begin(),v.end(),v.begin(),bind2nd(minus<int>(),'0'));
}
deque<int>::iterator begin()
{
return v.begin();
}
deque<int>::iterator end()
{
return v.end();
}
int size()
{
return v.size();
}
back_insert_iterator<deque<int>>Back_Inserter()//这段有错误,不知道怎么改
{
return back_inserter(v);
}
void push_front(int n)
{
v.push_front(n);
}
void push_back(int n)
{
v.push_back(n);
}
void adjust()
{
int nSize=v.size();
for(int i=nSize-1;i>=1;i--)
{
int value=v[i];
if(value<10)
continue;
v[i]=value%10;
v[i-1]=value/10;
}
int value=v[0];
if(value>=10)
{
v[0]=value%10;
value=value/10;
while(value>0)
{
v.push_front(value%10);
value/=10;
}
}
nSize=v.size();
}
MyBigNum Add(MyBigNum &m)
{
MyBigNum result;
int n=size()-m.size();
if(n>=0)
{
transform(begin()+n,end(),m.begin(),result.Back_Inserter(),plus<int>());
for(int i=n-1;i>=0;i--)
{
result.push_front(*(begin()+i));
}
}
else
{
transform(begin(),end(),m.begin()-n,result.Back_Inserter(),plus<int>());
for(int i=-n-1;i>=0;i--)
{
result.push_font(*(m.begin()+i));
}
}
result.adjust();
return result;
}
MyBigNum Multiply(MyBigNum& m)
{
MyBigNum mid;
for(int i=0;i<m.size();i++)
{
mid=*this;
for(int j=0;j<i;j++)
{
mid.push_back(0);
}
transform(mid.begin(),mid.end(),mid.begin(),bind2nd(multiplies<int>(),
*(m.begin()+i)));
result=mid.Add(result);
}
return result;
}
};
void main()
{
MyBigNum m1("1234567890");
MyBigNum m2("99999999998");
MyBigNum result=m1.Add(m2);
cout<<"1234567890+99999999998=";
copy(result.begin(),result.end(),ostream_iterator<int>(cout));
cout<<endl;
MyBigNum m3("99");
MyBigNum m4("99999");
MyBigNum m5=m3.Multiply(m4);
cout<<"99*99999=";
copy(m5.begin(),m5.end(),ostream_iterator<int>(cout));
cout<<endl;
}
错误已经指出,麻烦各位大侠指点一下 #include <string>
#include <deque>
#include <functional>
#include <algorithm>
using namespace std;
class MyBigNum
{
deque<int>v;
public:
MyBigNum(){};
MyBigNum(string strNum)
{
copy(strNum.begin(),strNum.end(),back_inserter(v));
transform(v.begin(),v.end(),v.begin(),bind2nd(minus<int>(),'0'));
}
deque<int>::iterator begin()
{
return v.begin();
}
deque<int>::iterator end()
{
return v.end();
}
int size()
{
return v.size();
}
back_insert_iterator<deque<int>>Back_Inserter()//这段有错误,不知道怎么改
{
return back_inserter(v);
}
void push_front(int n)
{
v.push_front(n);
}
void push_back(int n)
{
v.push_back(n);
}
void adjust()
{
int nSize=v.size();
for(int i=nSize-1;i>=1;i--)
{
int value=v[i];
if(value<10)
continue;
v[i]=value%10;
v[i-1]=value/10;
}
int value=v[0];
if(value>=10)
{
v[0]=value%10;
value=value/10;
while(value>0)
{
v.push_front(value%10);
value/=10;
}
}
nSize=v.size();
}
MyBigNum Add(MyBigNum &m)
{
MyBigNum result;
int n=size()-m.size();
if(n>=0)
{
transform(begin()+n,end(),m.begin(),result.Back_Inserter(),plus<int>());
for(int i=n-1;i>=0;i--)
{
result.push_front(*(begin()+i));
}
}
else
{
transform(begin(),end(),m.begin()-n,result.Back_Inserter(),plus<int>());
for(int i=-n-1;i>=0;i--)
{
result.push_font(*(m.begin()+i));
}
}
result.adjust();
return result;
}
MyBigNum Multiply(MyBigNum& m)
{
MyBigNum mid;
for(int i=0;i<m.size();i++)
{
mid=*this;
for(int j=0;j<i;j++)
{
mid.push_back(0);
}
transform(mid.begin(),mid.end(),mid.begin(),bind2nd(multiplies<int>(),
*(m.begin()+i)));
result=mid.Add(result);
}
return result;
}
};
void main()
{
MyBigNum m1("1234567890");
MyBigNum m2("99999999998");
MyBigNum result=m1.Add(m2);
cout<<"1234567890+99999999998=";
copy(result.begin(),result.end(),ostream_iterator<int>(cout));
cout<<endl;
MyBigNum m3("99");
MyBigNum m4("99999");
MyBigNum m5=m3.Multiply(m4);
cout<<"99*99999=";
copy(m5.begin(),m5.end(),ostream_iterator<int>(cout));
cout<<endl;
}