跪求程序“任意长整数的除法运算”

linlin2817 2007-02-02 11:26:30
求求大家帮帮忙,老师要求做的题,很急!我没学过C语言,实在没办法……我是新手,也没有什么分可以送给大家的,求求你们了!
【问题描述】
设计一个程序实现两个任意长的整数的除法运算。
【基本要求】
设计一个实现任意长的整数进行除法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
【实现说明】
可以用顺序表、单链表、循环单链表、双向链表、循环双向链表或者各种栈去表示长整数,其中 每个元素可以是字符、1位整数或分组的整数(4位一组),用单向链表表示时,可以采用低位在前,输出时再用个栈,进行输出。
...全文
1927 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
smallbirdapple 2007-02-27
  • 打赏
  • 举报
回复
任意长整数的除法,要是能突破了。数学界会大大开心得
lemonviva 2007-02-20
  • 打赏
  • 举报
回复
化除为乘,a/b = a*(1/b),而1/b可用牛顿迭代得出, x2=x1*(2-a*x1),当x2-x1小于要的精度时结束.x1的初值为x的真值附近的一个值
Jamesonang 2007-02-08
  • 打赏
  • 举报
回复
同意 gxqcn :

就我的需求,还用不了 ;-) ,对于一般目的的应用(非科学计算)简单方法就够了。
对于只有更好,没有最好的追求者来说,还有很多工作要做。

PS : gxqcn ,什么时候开始做多项式运算和有限域的运算?
另外,建议你的主页在做最新更新的时候,加一个更新时间。这样更加一目了然 ;)

如果可能,我建议你把你的个人主页放在 googlepages (http://pages.google.com) 上,可以自由定制页面,200M空间可以提供下载服务。 没有任何广告。

这个是我的 http://jamesonang.googlepages.com,刚开始做。
gxqcn 2007-02-08
  • 打赏
  • 举报
回复
Knuth 的方法适合于被除数与除数位数相差相对较小的情形,
比如在用 Euclid 辗转计算最大公约数的过程中的除法。

一般来说,超高精度的除法,还是转化成乘法来得快。
JAVA 的数学包并非是最快的,尤其当计算规模非常大时。
gxqcn 2007-02-08
  • 打赏
  • 举报
回复
对我来说,空间大小要求不高,50MB 就足矣了。
但我需要的是:放单文件可达 2MB、下载不受限制、能自由上传更新网页的空间。

感谢 Jamesonang,我会 try it 的。
Jamesonang 2007-02-08
  • 打赏
  • 举报
回复
200 M 应该够放了,合理的对文件命名能够方便管理。

在googlepages 上复制一个你现在的网站,并非难事。但 googlepages 仅支持非常有限的 javascript(安全因素).

try it. 如果觉得不满意,忘记它的存在就OK了

gxqcn 2007-02-08
  • 打赏
  • 举报
回复
因为有多个镜向站点,所以我需要更自由的功能(我对html语言和CSS较熟),
又由于网页图片很多,需要进行分目录管理。
Jamesonang 2007-02-08
  • 打赏
  • 举报
回复
使用 googlepages 必须用它提供的模版,即颜色方案和布局方案,有多种选择。

所有网页都在同一级别下,不能分目录管理。

可能存在一些 “技巧”能够使用自己的模版,google 搜索一下。
如果你熟悉html语言和CSS,可以有很多发挥的空间。



gxqcn 2007-02-08
  • 打赏
  • 举报
回复
关于更新,我有一个网页专门记录更新日志的,以方便网友阅读或下载。
对多项式运算,现还没有任何打算,只是想将现有的算法尽可能做得高效便捷。

另,关于 googlepages,不知是否可以自己指定主页(我不需要它的定制)?
是否可以分目录管理?想请教一下。
Jamesonang 2007-02-07
  • 打赏
  • 举报
回复
>> 对于更大的数(用于科学研究的),快速傅利叶变换(FFT)是已知最快的方法
我指的是乘法。

这些方法在 Knuth 的书中都有讲,包括S.A.COOK 提出的“高精度倒数算法”。但作为个人实践,要理解 FFT,并写出一个强壮的实现并非易事。

Jamesonang 2007-02-07
  • 打赏
  • 举报
回复
FFT 在一般计算并没有优势,除非做科学计算,要体现出优势的闸值很高,而且实现起来也相对困难。

分治法(实际上应该叫 Karatsuba 方法)也是在较大的数才比一般的“学校”方法有优势,<<密码编码学 加密方法的C与C++实现>>的作者经过试验,当数大于 2^2000 时,才有明显优势.

不知道你是否了解 Knuth 的长除法,看过后你会相信 “当除数和被除数相当的时候,长除法有优势”

我想 SUN 公司使用Knuth 的方法不是随机选择的结果...

sci.math 有个帖子,也详细讨论了除法问题,可以看看。
http://groups.google.com/group/sci.math/browse_thread/thread/1f1ea55f162e7fc3

liangbch 2007-02-07
  • 打赏
  • 举报
回复
"不过,有个人提出"化除为乘"的方法是最快的,是缺乏根据的主观猜测。"你可能不太清楚,FFT并不能直接计算除法,化除为乘算法仅仅需要乘法运算,而乘法运算可以采用FFT算法,所以采用这种算法,其复杂度和FFT算法是一样的,并不矛盾。下面以具体例子讨论一下。
如求 a/b 的商,a有16384位,b有16384位,则

第一阶段: 求1/b的倒数,这个阶段用逐步求精的方法实现.
首先.求1/b的初值,只精确到1位数字。
然后 用迭代的算法,依次得到2,4,8,16,32,64,128,256,... 8192位1/b
第二阶段:将a 乘以 第一阶段得到的 (1/b)。

对于大数相乘的复杂度,好多文章多有论述,当位数较小时,采用硬乘法最快(典型值为500bit以下),复杂度(n*n),但位数稍多时采用分治法最快(典型值为 500-30000bit左右),复杂度(n ^ 1.58)当位数大于一定长度,则采用FNT(快速数论变换,著名的afloat当位数较多时采用的即是这个方法)或者FFT算法(GMP即采用这个算法),复杂度n*log(n)
若大数乘法采用硬乘法,则第一阶段的计算量约等于 n*n,第二阶段的计算量为n*n,总的运算量约等于2倍的同等长度的大数乘法。
实际上,当被除数和除数位数相近时,且要求计算结果与被除数相近,采用化除为乘算法,其计算速度主要取决于你的大数乘法的实现,基本上其计算时间为同等规模的大数乘法的两倍。




duxiu 2007-02-07
  • 打赏
  • 举报
回复
我是把除法化为减法: 但效率很慢
void DivisionLongi(longint &La,longint &Lb)
{
Link s;
longint Lbb,product,temp,tempp;
product=GenerateOne(0);
temp=GenerateOne(1);
while(CmpLongi(La,Lb)>=0)
{
Lbb=DupLongi(Lb);
tempp=DupLongi(temp);
SubtractLongi(La,Lbb);
AddLongi(product, tempp);
}
DestroyList(La);
DestroyList(Lb);
La=product;
}

楼上的方法,具体是要怎么做的? 不太清楚
Jamesonang 2007-02-07
  • 打赏
  • 举报
回复
To liangbch(宝宝):

看了一下你发的这个讨论贴,主要讨论了化除为乘的方法,同这个帖子讨论的方法正好有互补性。

不过,有个人提出"化除为乘"的方法是最快的,是缺乏根据的主观猜测。 这个方法在除数较小的时候有优势,当被除数和除数都很大的时候没有Knuth的好。

对于更大的数(用于科学研究的),快速傅利叶变换(FFT)是已知最快的方法。

=======
JAVA 的数学包中,大整数的除法使用的是 Knuth的方法(长除法)
http://src.opensolaris.org/source/xref/sfw/usr/src/cmd/gcc/gcc-3.4.3/libjava/gnu/java/math/MPN.java#divide

开放源码 大整数运算库 GNU MP ,使用的是化除为乘的方法。
http://www.swox.com/gmp/#DOWNLOAD
duxiu 2007-02-07
  • 打赏
  • 举报
回复
如果用 试减法(即化除为减) 的话, 所用的时间,是非常非常之多!!
如一个,400位,跟一个200位 , 我用这种方法算,可谓等死了,还是没算出来!!

任意长整数的除法运算,的关键在于,运算效率如何?? 太慢了的算法,就等于没算法

liangbch 2007-02-07
  • 打赏
  • 举报
回复
看看这个帖子,内有我和别人的一些回复,相信对你有一些帮助。http://community.csdn.net/Expert/topic/4798/4798244.xml
Jamesonang 2007-02-05
  • 打赏
  • 举报
回复
通过讨论学习;-)

huanyun(无妻徒刑) 自己能够独立的写出大整数的除法就很不错的。
huanyun 2007-02-05
  • 打赏
  • 举报
回复
嗯 Jamesonang(Jameson Ang) 对大数的理解很强啊
学习中
Jamesonang 2007-02-05
  • 打赏
  • 举报
回复
口述容易,但写真的挺费事。

比如: A(n-1)A(n-2) .... A1A0 / C(m-1)C(m-2) .. C1C0 ;

手算大家都知道怎么算,即先取 A 的前 m位除以 C, 然后计算商和剩余,在继续进行后面的运算。

如何计算这 m 位的除法 呢?
令 q_ = min ( (A(m-1)B + A(m-2) ) / C(m-1) , B-1) ,
q_是商的估计 (用 A 的高2位和C的最高位对商进行估算)

Knuth 证明,只要 B/2< = C(m-1) < B (B 就是我们选择的基) , 即C的最高位足够大(大于 B/2),那么 q_和真实的 q 误差不超过2,然后进行一个额外的步骤排除误差,精确的计算出 q_。

如果 C 的最高位不足 B/2 , 可以对其进行约化,这个过程也很简单,具体还是看书吧。

也就是说,Knuth 的方法只使用 2-3个数(A的高位),和C的最高位,就能计算出 m位的除法。如果 C 很大(m = 15 基 B , B = 2^32 ),那么节省的计算量是可想而知的。

如果对这个方法感兴趣,可以买本书看看。实际上已经有现成的实现,如果只是打算用大整数,也没必要深究这些。会利用已有的库函数,做更多的工作就OK,不必白手起家。


renzaijiang 2007-02-05
  • 打赏
  • 举报
回复
Jamesonang(Jameson Ang) ( ) 信誉:100
能大概说下半数值的原理吗
加载更多回复(18)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧