高精度运算之乘法
发布时间:2020-12-14 02:56:27 所属栏目:大数据 来源:网络整理
导读:乘法运算之终极状态。(可以处理所有乘法运算,略叼)。 #includestdio.h#includeiostream#includestring#includealgorithm#includestring.husing namespace std;string add(string st1,string st2){ if(st1.size()st2.size()) //判断哪个长 { string stemp=
乘法运算之终极状态。(可以处理所有乘法运算,略叼)。 #include<stdio.h> #include<iostream> #include<string> #include<algorithm> #include<string.h> using namespace std; string add(string st1,string st2) { if(st1.size()<st2.size()) //判断哪个长 { string stemp=st1; st1=st2; st2=stemp; } reverse(st1.begin(),st1.end()); //将string类st1,st2逆转顺序 reverse(st2.begin(),st2.end()); int len1,len2; len1=st1.length(); //计算各自的长度 len2=st2.length(); int in=0,num; //进位in初始化为0 for(int i=0; i<len2; i++) { num=st1[i]-'0'+st2[i]-'0'+in; //各位的和 in=num/10; num%=10; st1[i]=num+'0'; //放入较长的string里 } for(int j=len2; j<len1; j++) //如果遇到例如123 99892这样的样例,123处理完后需要向前边进位 { num=st1[j]-'0'+in; in=num/10; num%=10; st1[j]=num+'0'; } if(in==1) //相加的结果比原有的string都长 st1+="1"; reverse(st1.begin(),st1.end()); return st1; } string multiplication(string st1,string st2) { if(st1[0]=='0'||st2[0]=='0') return "0"; reverse(st1.begin(),st1.end()); reverse(st2.begin(),len2,len; len1=st1.length(),len2=st2.length(); if(len1<len2) { string stemp=st1; st1=st2; st2=stemp; } len1=st1.size(); len=len2=st2.length(); string stnum; for(int i=0; i<len; i++) { string stemp; for(int k=0; k<i; k++) { stemp+="0"; } int muti,in=0; for(int j=0; j<len1; j++) { muti=(st2[i]-'0')*(st1[j]-'0')+in; in=muti/10; muti=muti%10; stemp+=muti+'0'; } if(in>0) stemp+=in+'0'; reverse(stemp.begin(),stemp.end()); // cout<<stemp<<endl; stnum= add(stnum,stemp); } return stnum; } string flo_multi(string ss1,string ss2) { int len1,pos_s1=0,pos_s2=0,num_f1=0,num_f2=0; string str1,str2; len1=ss1.length(),len2=ss2.length(); bool flag1=0,flag2=0,flag=0; for(int i=len1-1; i>=0; i--) { if(ss1[i]=='.') { pos_s1=i; break; } if(ss1[i]=='0'&&flag1==0) { continue; } flag1=1; str1+=ss1[i]; } int las_len1=str1.length(); // cout<<las_len1<<endl; reverse(str1.begin(),str1.end()); // cout<<str1<<endl; flag1=0; string tmp1; for(int i=0; i<pos_s1; i++) { flag=1; if(ss1[i]=='0'&&flag1==0) { continue; } flag1=1; tmp1+=ss1[i]; } str1=tmp1+str1; if(!flag) { num_f1=0; } else { num_f1=las_len1; } flag=0; // cout<<str1<<endl; for(int i=len2-1; i>=0; i--) { if(ss2[i]=='.') { pos_s2=i; break; } if(ss2[i]=='0'&&flag2==0) { continue; } flag2=1; str2+=ss2[i]; } // cout<<str2<<endl; int las_len2=str2.length(); flag2=0; reverse(str2.begin(),str2.end()); // cout<<str2<<endl; string tmp2; for(int i=0; i<pos_s2; i++) { flag=1; if(ss2[i]=='0'&&flag2==0) { continue; } flag2=1; tmp2+=ss2[i]; } str2=tmp2+str2; // cout<<str2<<endl; if(!flag) { num_f2=0; } else { num_f2=las_len2; } // cout<<num_f1<<" "<<num_f2<<endl; if(flag1==0&&num_f1!=0) { string temp1; reverse(str1.begin(),str1.end()); for(int i=num_f1-1; i>=0; i--) { if(str1[i]=='0'&&flag1==0) { continue; } flag1=1; temp1+=str1[i]; } str1=temp1; // cout<<str1<<endl; } // cout<<flag2<<endl<<num_f2<<endl; if(flag2==0&&num_f2!=0) { string temp2; reverse(str2.begin(),str2.end()); // cout<<str2<<endl; for(int i=num_f2-1; i>=0; i--) { if(str2[i]=='0'&&flag2==0) { continue; } flag2=1; temp2+=str2[i]; } str2=temp2; // cout<<str2<<endl; } // cout<<str1.length()<<endl<<str2.length()<<endl; if(str1.length()==0) { str1="0"; } if(str2.length()==0) { str2="0"; } // cout<<str1<<endl<<str2<<endl; string ans_st= multiplication(str1,str2); string ans; // cout<<ans_st<<endl; // cout<<ans_st.length()<<endl<<num_f1+num_f2<<endl; if(ans_st.length()>num_f1+num_f2&&(pos_s1!=0||pos_s2!=0)) { reverse(ans_st.begin(),ans_st.end()); for(int i=0; i<num_f1+num_f2; i++) { ans+=ans_st[i]; } ans+='.'; for(int i=num_f1+num_f2; i<ans_st.length(); i++) { ans+=ans_st[i]; } reverse(ans.begin(),ans.end()); } else if(ans_st.length()<=num_f1+num_f2&&(pos_s1!=0||pos_s2!=0)) { reverse(ans_st.begin(),ans_st.end()); for(int i=0; i<ans_st.length(); i++) { ans+=ans_st[i]; } for(int i=0; i<num_f1+num_f2-ans_st.length(); i++) { ans+='0'; } ans+='.'; ans+='0'; reverse(ans.begin(),ans.end()); } else { ans=ans_st; } // cout<<ans<<endl; return ans; } int main() { // freopen("INput.txt","r",stdin); // freopen("OUT.txt","w",stdout); string s1,s2; while(cin>>s1>>s2) { cout<<flo_multi(s1,s2)<<endl; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |