分治法 大数乘法
来源:互联网 发布:自己建一个淘宝秒杀群 编辑:程序博客网 时间:2024/06/08 10:41
不知道有没有更高效的算法
#include "stdio.h" #include "stdlib.h" #define M 100 typedef struct _Node{ int s[M]; int l; int c; }Node, *pNode; void cp(pNode src, pNode des, int st, int l){ int i, j; for(i=st, j=0; i<st+l; i++, j++){ des->s[j] = src->s[i]; } des->l = l; des->c = st + src->c; } /* 分治法 大数乘法 X = A*10^n + B Y = C*10^m + D X*Y = A*C*10^(n+m) + A*D*10^n + B*C*10^m + B*D */ void add(pNode pa, pNode pb, pNode ans){ int i, c; int ta, tb; pNode k; if(pa->c < pb->c){ k = pa; pa = pb; pb = k; } ans->c = pb->c; c = 0; for(i=0; i<pa->l+pa->c-pb->c; i++){ if(i<pa->c-pb->c) ta = 0; else ta = pa->s[i-(pa->c-pb->c)]; if(i>=pb->l) tb = 0; else tb = pb->s[i]; ans->s[i] = (ta + tb + c)%10; c = (ta + tb + c)/10; } if(c) ans->s[i++] = 1; ans->l = i; } void mul(pNode pa, pNode pb, pNode ans){ int i, c, w; int ma = pa->l>>1, mb = pb->l>>1; Node ah, al, bh, bl; Node t1, t2, t3, t4, z; pNode k; if(!ma || !mb){ if(!ma){ k = pa; pa = pb; pb = k; } ans->c = pa->c + pb->c; w = pb->s[0]; c = 0; for(i=0; i<pa->l; i++){ ans->s[i] = (w*pa->s[i] + c)%10; c = (w*pa->s[i] + c)/10; } if(c) ans->s[i++] = c; ans->l = i; return; } cp(pa, &ah, ma, pa->l-ma); cp(pa, &al, 0, ma); cp(pb, &bh, mb, pb->l-mb); cp(pb, &bl, 0, mb); mul(&ah, &bh, &t1); mul(&ah, &bl, &t2); mul(&al, &bh, &t3); mul(&al, &bl, &t4); add(&t3, &t4, ans); add(&t2, ans, &z); add(&t1, &z, ans); } int main(){ Node ans; int i; //54321 * 543 Node a = {{1, 2, 3, 4, 5}, 5, 0}; Node b = {{3, 4, 5}, 3, 0}; mul(&a, &b, &ans); for(i=ans.l-1; i>=0; i--) printf("%d", ans.s[i]); printf("\n"); return 0; }
- 大数乘法 分治法
- 分治法 大数乘法
- 分治法求大数乘法
- 采用分治法进行大数乘法运算
- 采用分治法进行大数乘法运算 (java)
- 大数乘法的分治策略C++实现
- 大整数乘法(分治法)
- 大整数乘法 ------分治法
- 分治法求大数相乘
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 深度优先搜索、广度优先搜索(java)
- 提高hadoop的mapreduce job效率笔记之二(尽量的用Combiner)
- html中meta http-equiv="refresh"
- 在windows和linux文件共享
- 图片
- 分治法 大数乘法
- 链表的循环链接
- linux平台上通过jfreechart生成的PNG图像中显示的汉字为方框的问题的解决
- Linux内核笔记9
- C#中简单调用c/c++模块
- 深度优先、广度优先java实现
- php引用传值
- 虚拟化网络演进模拟对话
- java中将double转型为int。java中的幕运算方法Math.pow()。