超大数乘法 -----数位压缩
思路:
可以将几位数字存储在一个数组存储单元中。不只乘法,加法也可以压位。
本次代码中压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 /**************************************/