用string做了大数运算的加减乘法,不过除法暂时还没想到该怎么做。。。算是一个较大的模拟吧。*^◎^*
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int accurate=8;
void trim(string & n)
{
bool dot=false;
unsigned int loc=n.find('.',0);
if(loc!=string::npos)dot=true;
if(dot)
{
int i=0;
while(n.at(n.size()-1)=='0' )
n.erase(n.size()-1,1);
if(n.at(n.size()-1)=='.')
n.erase(n.size()-1,1);
if(n=="")n="0";
}
while(n.at(0)=='0' && n.size()>1)
n.erase(0,1);
if(n.at(0)=='.')n.insert(0,1,'0');
}
int FindDot(string &n)
{
unsigned int flag=n.find('.',0);
if(flag==string::npos)
return 0;
else
return n.size()-flag-1;
}
void homogeneous(string &n1,string &n2)
{
bool has_dot=true;
int flag1=FindDot(n1) , flag2=FindDot(n2);
if(!flag1 && !flag2)has_dot=false;
if(has_dot)
{
if(!flag1)
n1.append(".");
if(!flag2)
n2.append(".");
if(n1.size()-flag1<n2.size()-flag2)
n1.insert(0,n2.size()-flag2+flag1-n1.size(),'0');
else
n2.insert(0,n1.size()-flag1+flag2-n2.size(),'0');
if(flag1<flag2)
n1.append(flag2-flag1,'0');
else
n2.append(flag1-flag2,'0');
}
else
{
if(n1.size()<n2.size())
n1.insert(0,n2.size()-n1.size(),'0');
else
n2.insert(0,n1.size()-n2.size(),'0');
}
}
string Addition(string n1,string n2)
{
trim(n1);
trim(n2);
homogeneous(n1,n2);
bool carry=false;
int i=0;
for(i=0;i<n1.size();++i)
{
if(n1.at(n1.size()-i-1)=='.')continue;
int temp=n1.at(n1.size()-i-1)-'0'+n2.at(n2.size()-i-1)-'0'+carry;
if(temp>=10)
{
temp-=10;
carry=true;
}
else carry=false;
n1.at(n1.size()-i-1)=temp+'0';
}
if(carry)n1.insert(0,1,'1');
trim(n1);
return n1;
}
bool compare(string n1,string n2)
{
for(int i=0;i<n1.size();++i)
{
if(n1.at(i)<n2.at(i))return true;
else return false;
}
}
void sub_carry(string &n,int i,int temp)
{
if(temp<0)
{
int token=i+1;
for(;token<n.size();++token)
{
if(n.at(n.size()-token-1)=='.')continue;
temp=n.at(n.size()-token-1)-'0'-1;
if(temp>=0)n.at(n.size()-token-1)=temp+'0';
else
{
n.at(n.size()-token-1)='9';
sub_carry(n,token,temp);
}
return;
}
}
}
string Subtraction(string n1,string n2)
{
trim(n1);
trim(n2);
homogeneous(n1,n2);
bool negative=false;
if(compare(n1,n2))
{
negative=true;
string temp=n1;
n1=n2;
n2=temp;
}
int i=0;
bool carry=false;
for(i=0;i<n1.size();++i)
{
if(n1.at(n1.size()-i-1)=='.')continue;
int temp=n1.at(n1.size()-i-1)-n2.at(n2.size()-i-1);
if(temp<0)
{
sub_carry(n1,i,temp);
temp+=10;
}
n1.at(n1.size()-i-1)=temp+'0';
}
if(negative) n1.insert(0,1,'-');
trim(n1);
return n1;
}
string Multiplication(string n1,string n2)
{
trim(n1);
trim(n2);
if(n1.size()<n2.size())
{
string temp=n1;
n1=n2;
n2=temp;
}
int flag1=n1.find('.',0),flag2=n2.find('.',0);
int f1,f2;
if(flag1==string::npos)flag1=0,f1=0;
else
{
n1.erase(flag1,1);
f1=n1.size()-flag1;
}
if(flag2==string::npos)flag2=0,f2=0;
else
{
n2.erase(flag2,1);
f2=n2.size()-flag2;
}
string ans="0";
for(int i=0;i<n2.size();++i)
{
int carry=0;
string t="";
for(int j=0;j<n1.size();++j)
{
int temp=(n2.at(n2.size()-1-i)-'0')*(n1.at(n1.size()-1-j)-'0')+carry;
carry=0;
while (temp>=10)
{
temp-=10;
++carry;
}
t.insert(0,1,temp+'0');
}
if(carry)
{
t.insert(0,1,carry+'0');
}
for(int num=0;num<i;++num)
t.append(1,'0');
ans=Addition(ans,t);
}
if(ans!="0")
ans.insert(ans.size()-f1-f2,1,'.');
trim(ans);
return ans;
}
string Divide(string n1,string n2)
{
trim(n1);
trim(n2);
unsigned int flag1=n1.find('.',0),flag2=n2.find('.',0);
int f=0;
if(flag2==string::npos)flag2=0;
else
{
n2.erase(flag2,1);
f+=n2.size()-flag2-1;
}
if(flag1==string::npos)flag1=0;
else
{
n1.erase(flag1,1);
f+=n1.size()-flag1-1;
}
while(compare(n1,n2))
{
n1.append("0");
--f;
}
string ans="0";
int postition=0;
for(int i=0;i<n2.size();++i)
{
int carry=0,temp=0,reminder=0,pos=0;
string res="";
bool dot=false;
for(int j=0;j<n1.size();++j)
{
if(carry)
{
temp*=10;
}
temp+=n1.at(j)-'0'+reminder*10;
if(temp<n2.at(i)-'0' && temp>0)
{
++carry;
continue;
}
carry=0;
reminder=temp%(n2.at(i)-'0');
res.append(1,temp/(n2.at(i)-'0')+'0');
temp=0;
}
if(reminder)
{
res.append(1,'.');
for(int t=0;t<=accurate;++t)
{
if(reminder==0)break;
int temp=reminder*10;
res.append(1,temp/(n2.at(i)-'0'));
reminder=temp%(n2.at(i)-'0');
}
}
ans=Addition(ans,res);
}
return ans;
}
int main()
{
string n1,n2;
while(cin>>n1>>n2)
{
cout<<Addition(n1,n2)<<endl;
cout<<Subtraction(n1,n2)<<endl;
cout<<Multiplication(n1,n2)<<endl;
// cout<<Divide(n1,n2)<<endl;
}
return 0;
}