| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1798 人关注过本帖
标题:大数相乘实现算法的相关想法 有容老兄要来哟!!!!敢给着个色么
取消只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
 问题点数:0 回复次数:8 
大数相乘实现算法的相关想法 有容老兄要来哟!!!!敢给着个色么

采用分治算法实现  包括两部分的分解
乘数和被乘数 的分解
设 乘数a是由数字集合a={a1,a2,a3...........an}   n代表的是a数的位数大于0的正整数 用 a=f(1,n)
设被乘数b是由数字集合b={b1,b2,b3..........bx}   x代表的是b数的位数大于0的正整数    b=f(1,x)

被乘数的分解算法
第一次分解 :
分解结果为:
lift={b1.........bx/2}
right={b(x/2+1).......bx}
用函数表达式   lift=F(1,b/2) ,right=F(x/2+1,x) 表示  n
那么 被乘数  a=lift*10^(x-x/2-1)+right
由乘法规则  (a+b)*c=a*c+b*c的 可以得到
a*b=a* lift*10^(x-x/2-1)+b*right 的表达式    的合并过程
下面怎么推算我就不推了  直接给通项表达式 设b=f(x,y)  则有 right=f(x,(x+y)/2)  lift=f((x+y)/2+1,y)
f(x,y)=(lift*10^(y-(x+y)/2-1)+right)*a  合并算法
存在
c 程序的代码段就为
乘数
fenjie(int num,int x, int y)
{
int q
q=(x+y)/2
while(q<y)
{
f1=fenjie (int num,int x,int (x+y)/2)
f2=fenjie(int num,int (x+y)/2+1,int y)
}
合并代码位置
代码完成功能     f(x,y)=(lift*10^(y-(x+y)/2-1)+right)*a  的计算
 这个是被乘数  
还得对a*bx进行求解  bx代表的是单个位数  再对a进行分解 变成 a的单个数位置上的与bx相乘 的分解合并求解过程,这个过程和上面的 代码是差不多的 嘿嘿
}
呵呵 算法描述完毕


[ 本帖最后由 zhu224039 于 2012-10-3 13:56 编辑 ]
搜索更多相关主题的帖子: 正整数 表达式 
2012-10-03 13:18
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
算法出来了,
吧问题转换成了 大数加法的问题  嘿嘿   你懂得

将大数 如何 存放在不同的 16位 存储空间中  嘿嘿

这个也是个分解过程  将 大数 分解成 a=FFFFH+FFFFH+FFFFH+FFFFH+FFFFH+FFFFFH+X
的形式
上面的算法可以实现 区块与区块的运算   嘿嘿
将大数区块化
 区块的运算求解 又要分 两个数区块分解 做乘法运算的问题
区块分解的 (FFFFH+FFFFH+FFFFH+FFFFH+FFFFH+FFFFFH+X)*a
在对a 进行区块分解求解
又是一个 分治 合并的过程
嘿嘿  你敢写这个代码么


[ 本帖最后由 zhu224039 于 2012-10-3 13:37 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-10-03 13:26
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
我想代码其实不是很长哟,我只想用C语言编个 数组a 存放乘数 数组b 存放 被乘数的  两个数组的乘法算法拉倒


[ 本帖最后由 zhu224039 于 2012-10-3 13:47 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-10-03 13:40
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
另一种实现
汇编语言 还可以用压缩的数据类型 里面存放123456789  来存放 输入进去的数字字符
来模拟 十进制   乘法
数相乘的结果 BCD1*BCD *10^x的形式进行转换 存储到一个能放下这么大的一个数的 内存空间中去


这个实现过程要简单的多

我要成为嘿嘿的黑客,替天行道
2012-10-03 14:04
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
同样要用到上面的分治算法  实现   嘿嘿  在对算法进行下改进,不觉得麻烦的话就建立一个  9*9的 乘法表,加快程序处理速度 就更完美了

[ 本帖最后由 zhu224039 于 2012-10-3 14:09 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-10-03 14:05
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
  我想我弄明白了

我要成为嘿嘿的黑客,替天行道
2012-10-03 14:37
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
在进一步的朝前想,可以利用压缩型的十进制  0 1 2 3 4 5 6 7 8 9
他们的2位BCD数字 利用程序可以自动生成一个表 里面存放的是9*9正的10进制的16位二进制表
BCD码为4位1个数  那么就可以建立一张 映射表出
8位 二进制  ----------》10进制的 两BCD的二进制表的 映射关系
高4位 低4位  利用指令AND来屏蔽 4位 来表示BCD  4位表示BCD1   利用 移位指令来 生成这个 8位二进制

一个字有16位 用了低8位 ,高八位用来索引?
那么他的表示范围 就是0-9999  区间的 二进制表

对于一个16位数来说 这个是不够的  

模仿80386的内存的段管理模式  用 段选择符 :偏移地址的方式来做
建立一个段操作符----->二进制表-----》真正的二进制 过程来扩展

或者   8086的 基础地址+偏移地址 形成 物理过程的寻址 这个过程
几位呢
拿来当段操作符呢
我觉得映射 比较合理  

后面的在构思中 嘿嘿 吃饭去了

我要成为嘿嘿的黑客,替天行道
2012-10-03 15:06
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
想好了怎么搞,才能更好的搞

具体搞什么 后面是联想
这里的搞=写代码

我要成为嘿嘿的黑客,替天行道
2012-10-03 15:12
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
好的    等我搞

我要成为嘿嘿的黑客,替天行道
2012-10-03 15:14
快速回复:大数相乘实现算法的相关想法 有容老兄要来哟!!!!敢给着个色么
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048903 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved