前两天一直在做这一道题,题目其实很简单,求n的阶乘,即从1× 2× 3……× n。但是这个要求的数特别大,当n=100000时,结果恐怕有上万位,所以,一种解决方法是用数组存储各个数位,例如用数组 array[] 123456789,那么array[0]=1,array[1]=2 …..array[8]=9。至于计算过程,我们可以想象一下自己做乘法,例如,算12× 34 ,先算12×4,再将结果移位并×3。好了,整个解题的基本原理就是这样了。

初次尝试

为了节约储存的空间,我第一次是用char型数组存储各位的,但在计算的过程中,不可避免的要遇到把字符转换为数字的过程,在每次一次算中,特别是数据非常大时,每一次计算要有成千上万次的字符转数字过程,所以最后的结果是时间超时,并不是我当初未雨绸缪的“内存超限”,当然,其中有一步没有优化,总之失败。

第二次尝试

这次,去网上搜了一些成功的案例以及在论坛提问,于是决定用int数组存储数字的各位,例如,结果是 123456789,那么 int[0]=1,int[1]=2…..int[8]=9。再用一个intpos记录结果有多少位,这样可以节约for()循环的时间,最后AC了。

按照 davelv 的思路优化

主要的思想是用一个int存很多个数据,而之前我是一个int只存一个数。

如果最后结果是 12345678909876543210000
D是 r[0]=543210000
r[1]=678909876
r[2]=12345

我原来理解是 从r[0]~~r[23]各存一位,那么每次的取模(MOD)就应该是1 000 000 000了,而不是10一个int 4字节,最大2^32-1 ,结果 =4 294 967 294,一共9位。

这样优化的确大大的提高了执行效率,减少了内存占用,上图,下面一行为优化后的。

可见,优化的力量是非常强大的!

好了,就写到这儿

贴出   我的代码 和   davelv的代码(你不介意吧 ^_^

后记:就在我写这篇博文的时候,神奇的D牛还在优化代码,据说他的代码已经可以在200毫秒左右执行完了!膜拜之~等待明天他的解题报告!

Tags: . 14,729 views
Home

14 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.