大数乘法 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 }

 

posted on 2012-07-20 18:49  L_S_X  阅读(1036)  评论(0编辑  收藏  举报

导航