用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; }