大数相乘---吃米粉时想到的
来源:互联网 发布:淘宝主图视频制作工具 编辑:程序博客网 时间:2024/04/28 19:41
好不容易,你得到个为银行工作的机会。作为程序员的你,上班第一天就遇到个头痛的问题。你上司要你写程序计算出10000000000234567800000 X 2343466888888880000000的结果。
也许是为了考验你,也许是真的有这个需求。不管怎样,面对这道题,你要怎么做?用32位的整数肯定不行,64位的也不能保证不会溢出。
题目要是求2的幕就好了,求2^m你只要将2左移m位就万事大吉。这么变态的大数,还要相乘,你都在怀疑自己是否真的适合这份工作。
把大数赋给整形变量,再用传统的c = a * b来求结果肯定不行。将大数看成字符串,接着移位倒是不错的做法。假设y代表一个大数,你要求y * 22的结果,问题可以转换成这个样子:
y * 22 = y * (20 + 2)
= (y * 20) + (y * 2)
= (y * 10 * 2) + (y * 2)
假设z = y * 10,z的值可以通过在y后直接补一个0得到,等式就变成:
y * 22 = (z * 2) + (y * 2)
将大数z和y都看成字符串,乘于2的操作可以逐位进行,对于形如123456234 * 2这样的算式,可以先取最后一个字符4,将4与2相乘,得8,同时将8作为字符保存起来;接着将倒数第二位的3与2相乘,得6,保存结果;再取排在倒数第3位的2,将它与2相乘......,依次类推。逐位击破,最后得到的就是相乘的结果。
回到文章开头的例子,求10000000000234567800000 X 2343466888888880000000的结果可以分解为移位再、逐位相乘、再相加,乘数234346688888888的最高位为2,2后面跟着
21个0,计算的第一步就是在代表被乘数的字符串“10000000000234567800000”后面加上21个0,变成“1000000000023456780000000000000000000000”,再将该字符串逐位与2相乘,得到字符串“2000000000046913560000000000000000000000”,接着用同样的方法处理次高位的3。
- 大数相乘---吃米粉时想到的
- 由速算思路想到的大数相乘算法(一)
- 大数相乘的解决
- 大数相乘的算法
- 大数相乘的源码
- 整数的大数相乘
- 大数相乘的解决方法
- 两个大数的相乘
- 大数相乘的实现
- opencv由Mat相乘想到的几个问题
- 大数相乘的C++实现
- 大数相乘的c代码
- 大数相乘的一种新思路
- 自己写的大数相乘
- 两个整数的大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 谈谈历史:中国历史的第一个纪年
- Android Intent的几种用法全面总结
- 传智播客-Java基础加强-day7
- Qt调用dll中的功能函数(转)
- 光脚丫学LINQ(045):如何表示计算所得列(LINQ to SQL)
- 大数相乘---吃米粉时想到的
- Magento Development Environment
- 用VC + Eclipse调试jni的native代码
- C++中的fstream类 简介
- 将PPT文件转换为Word文档
- VB备份与还原SQL数据库代码
- 各种平台下Perl模块的安装方法
- CWnd::MessageBoxw:cannot convert parameter 1 from 'const char[19] to ' 'LPCTSTR'
- win2003 64位英文 IIS安装.net 2.0时的问题 IsDomainController failed with HRESULT 80070842