大数乘法巧解
关键字: 转贴
很容易看出规律出来:
1、粉红色格式里头的数为对应列和行位置上数的乘积。如第一行,9=9 X 1,这样就可以求出所有粉红色格子里头的数。
2、把粉红色格子里头的数的不同位分别放在红色斜线的两侧,如果十位没有,那么用零补充。
3、从右下角开始,我们把同处于斜线一侧的数相加,结果存放到对应的左下部位的格子里头。如4=4, 5=2+0+3, 5=6+3+4+0+2 mod 10[进位为一], 0=1[进位]+3+7+2+6+0+1 mod 10,以此类推,直到左上角。
实际上,仔细分析以下,我们就会这种乘法和我们小学就学习过的“竖式乘法”原理是一样的,所以肯定是正确的。但是,这种描述方式给我们带来了算法设计和实现上的突破。
下面我们就需要把它实现了。
首先,我们定义数据的存储方式,乘数和被乘数直接存放到两个一維数组里头,中间过程(即粉红色背景部分)用一个三维数据来存放,存放形式如下:

| Rect[3][2][1] = 4 Rect[3][2][0] = 0 Rect[3][1][1] = 2 Rect[2][2][1] = 3 ... |
1、计算结果的最后一位的下标最大,其下标之和为6;倒数第二位的下标之和为5,以此类推,第一位的下标之和是0。因此,下标之和的顺序刚好是结果位的位序,我们可以据此求出结果的各个位。
2、最大的下标之和刚好是乘数位数和被乘数位数之和减一,结果位数是乘数位数和被乘数位数之和。据此,我们可以定义结果数组和一维数组,大小是乘数和被乘数位数之和的一维数组来存放结果。
下面我们就根据这种思路写出我们的大数乘法的function,然后再通过调用该function,解决上面的题目——即求出大整数的幂。
Code
[1] lnmp.c -- count the product of two large numbers' multiplication
|
|
Demo
| shell> make lnmp cc lnmp.c -o lnmp shell> ./lnmp Please input two large numbers: 2 5 The product of the muliplication is: 10 shell> ./lnmp Please input two large numbers: 22222222222222222222222222222222222222222222222222222222222222222222222222 5 The product of the muliplication is: 111111111111111111111111111111111111111111111111111111111111111111111111110 shell> ./lnmp Please input two large numbers: 0000000000000000000000000000000000000000000000002 000000000000000000000000000000000000000000000055 The product of the muliplication is: 110 |
[2] rton.c -- count the result of r to the nth(r ^ n)
说明:这里并不是直接调用上面的大数乘积的function,为了更方便地操作和节省内存,进行了一定的调整。
|
|
Demo
测试数据:文件名test.txt(说明:下面的测试结果我增加了两条测试数据,非常重要的两条)
| 95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12 |
发表评论
- 浏览: 8254 次
- 性别:

- 来自: 广州

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
谈新手修练J2EE武功及学SS ...
好文章,好建议。 我从事j2ee开发快两年了,但感觉技术一直没什么大的 ...
-- by 清风朗月 -
JAXB2.0 Project实例
不错Binding Schema那块也一起讲讲就好了
-- by Joo -
REST架构风格的性能为何比 ...
我只是一个刚刚学REST的学生,对SOAP也不是很熟。这篇文章我贴明是转贴过来的 ...
-- by younker -
REST架构风格的性能为何比 ...
呵呵,看楼主的意思好像是搞了10多年的soap的样子? REST最优?证据呢?拿 ...
-- by yananay -
RESTful Web Services---a ...
这篇文章详细讲述了REST的实现,是一篇不可多得的好文章
-- by younker






评论排行榜