超大数乘法 -----数位压缩

思路:

   可以将几位数字存储在一个数组存储单元中。不只乘法,加法也可以压位。

本次代码中压9位。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define LL __int64
 5 #define N 15000
 6 #define M 50005
 7 #define MOD 1000000000  //模
 8 #define wei 9  //压的位数
 9 using namespace std;
10 
11 LL a[N],b[N],ans[N];
12 char c[M],d[M];
13 /*************存储处理部分******************/
14 int StrToNum(char t[],LL tt[]) //返回存储长度
15 {
16   int len=0,t_len=strlen(t);
17   int i,cnt=1;
18   LL d=1,temp=0;
19   for(i=t_len-1;i>=0;i--)
20   { 
21       temp+=(t[i]-'0')*d;
22       if(cnt==wei)
23       {
24          tt[len++]=temp;
25          temp=0;
26          cnt=d=1;
27       }
28       else
29       {
30             cnt++;
31             d=d*10;
32       }
33   }
34   tt[len++] = temp;
35  //for(i=0; i<len; i++)
36      //   printf("%I64d ", tt[i]);
37  //cout<<endl;
38   return len;
39 }
40 /************************************/
41 /************乘法部分*************/
42 void mult(char c[],char d[])
43 {
44     int a_len,b_len,i,j;
45     LL flag,temp;
46    memset(a, 0, sizeof(a));
47    memset(b, 0, sizeof(b));
48    memset(ans, 0, sizeof(ans));
49    a_len= StrToNum(c, a);
50    b_len= StrToNum(d, b);
51   for(i=0;i<a_len;i++)
52   {
53      flag=0;
54     for(j=0;j<b_len;j++)
55     {
56 
57         temp=ans[i+j]+a[i]*b[j]+flag;
58     //    printf("%I64d\n ", temp);
59         ans[i+j]=temp%MOD;
60         flag=temp/MOD;
61     }
62     while(flag)
63      {
64         temp = ans[i+j]+ flag;  
65         ans[i+j]=temp%MOD;
66         flag=temp/MOD;
67      }
68   }
69 /***********************************/
70   /***********输出部分**************/
71   a_len=a_len+b_len+2;
72   while(!ans[a_len]&&a_len>0)a_len--;
73   if(a_len>=0) printf("%I64d", ans[a_len--]);
74    while(a_len>=0) printf("%09I64d",  ans[a_len--]);
75     printf("\n");
76 /*********注意输出格式的控制***************/
77 }
78 /**************************************/
79 /************主函数部分***************/
80 int main()
81  {
82   while(scanf("%s%s",c,d)!=EOF)
83   {
84       mult(c,d);
85   }
86 return 0;
87  }
88 /**************************************/

 

posted on 2012-07-24 17:48  L_S_X  阅读(933)  评论(0编辑  收藏  举报

导航