大数乘法 poj2389
思路:
大数乘法:同样是模拟的策略,将中一个拆成一位一位的去乘,再调用大数加法。
同样返回的为string。
代码如下:
1 #include<iostream> 2 #include<string> 3 using namespace std;
//大数加法 4 string add(string a,string b) 5 { 6 int i=a.length()-1,j=b.length()-1; 7 int k=0,flag=0;//flag 进位的标志 8 string ans=""; 9 while(i>=0&&j>=0) 10 { 11 ans+=a[i]+b[j]-'0'+flag; 12 flag=0; 13 if(ans[k]>'9') 14 { 15 flag=1; 16 ans[k]=ans[k]-10; 17 } 18 i--,j--,k++; 19 } 20 while(i>=0) 21 { 22 ans+=a[i]+flag; 23 flag=0; 24 if(ans[k]>'9') 25 { 26 flag=1; 27 ans[k]=ans[k]-10; 28 } 29 i--,k++; 30 } 31 while(j>=0) 32 { 33 ans+=b[j]+flag; 34 flag=0; 35 if(ans[k]>'9') 36 { 37 flag=1; 38 ans[k]=ans[k]-10; 39 } 40 j--,k++; 41 } 42 if(flag)//连续进位的情况 43 { 44 ans+=(flag+'0'); 45 k++; 46 } 47 char t; 48 for(i=0,j=k-1;i<j;i++,j--) 49 { 50 t=ans[i];ans[i]=ans[j];ans[j]=t; 51 } 52 return ans; 53 }
//大数乘法 54 string chengfa(string a,string b) 55 { 56 string ans="0",c; 57 int a_len=a.length()-1,b_len=b.length()-1,i,j,t,k; 58 int flag;//标志进位 59 char ch; 60 for(i=a_len;i>=0;i--) 61 { 62 flag=0; 63 c=""; 64 for(j=i;j<a_len;j++) c+='0'; //扩充位数 65 for(j=b_len;j>=0;j--) 66 { 67 t=(b[j]-'0')*(a[i]-'0')+flag; 68 flag=t/10; 69 c+=(t%10+'0'); 70 } 71 if(flag) 72 c+=(flag+'0'); 73 for(j=0,k=c.size()-1;j<k;j++,k--) //反转 74 { ch=c[j];c[j]=c[k];c[k]=ch;} 75 ans=add(ans,c); 76 }
if(ans[0]=='0')return "0";//排除0*x=00**0的情况 77 return ans; 78 } 79 int main() 80 { 81 string a,b; 82 while(cin>>a>>b) 83 { 84 cout<<chengfa(a,b)<<endl; 85 } 86 return 0; 87 }
值得注意的是:扩充位数的地方,这是为了模拟乘法时进行加法的需要。
大数乘法二:
1 /* 2 123 i 3 * 123 j 4 _______ 5 369 6 246 7 123 8 _______ 9 [4][3][2][1][0]---->>i+j 的值 10 */ 11 12 #include<iostream> 13 #include<cstdio> 14 #include<cstring> 15 #include<string> 16 #define N 20000 17 using namespace std; 18 string rev(string temp) //反转函数 19 { 20 int len=temp.length(); 21 char t; 22 for(int i=0,j=len-1;i<j;i++,j--) 23 { t=temp[i];temp[i]=temp[j];temp[j]=t;} 24 return temp; 25 } 26 string mult(string a,string b) 27 { 28 int i,j,flag,t,k; 29 string ans=""; 30 char c[N]; 31 a=rev(a); 32 b=rev(b); 33 memset(c,'0',sizeof(c));//初始化为'0',ASCII为48 34 for(i=0;i<a.length();i++) 35 { 36 flag=0; 37 for(j=0;j<b.length();j++) 38 { 39 t=c[i+j]-48 +(a[i]-48)*(b[j]-48)+flag; 40 c[i+j]=t%10+48; 41 flag=t/10; 42 } 43 while(flag) 44 { 45 t = c[i+j] - 48 + flag; 46 c[i+j]=t%10+48; 47 flag=t/10; 48 } 49 } 50 k=N-1; 51 while(c[k]=='0'&&k>0)k--; 52 for(i=k;i>=0;i--) 53 ans+=c[i]; 54 if(ans[0]=='0')return "0"; 55 return ans; 56 } 57 int main() 58 { 59 string a,b; 60 while(cin>>a>>b) 61 { 62 cout<<mult(a,b)<<endl; 63 } 64 return 0; 65 }