乘法運算之終極狀態。(可以處理所有乘法運算,略叼)。
#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(),st2.end());
int len1,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,len2,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;
}