http://www.dewen.net.cn/q/13558/100阶乘
http://www.dewen.net.cn/q/13558/100阶乘
追梦天涯
1 票
追梦天涯 19
100阶乘怎么算才不会溢出
评论 (0) • 举报 (0) • 分享 • 链接 • 2013-07-07
添加评论...
3个答案 票 数
brayden认证专家
1 票
brayden6562
最佳答案
解决方法就是自己构造数据结构.
可以参考Java中BigInteger的实现.
1. 数据结构中包含 标志位, -1表示负数, 1表示正数, 0表示0.
2. 用一个int数组 表示 这个大数. java里的实现, 数组为mag, 那么mag[0]表示的位数最大, 就是说是反过来看的, 保证mag[0]不为0.
BigInteger中乘法的实现, 和我们平时手算乘法公式类似, 一位一位乘, 要考虑进位. 主要源码如下, 两个int数组相乘得到结果的int数组:
final static long LONG_MASK = 0xffffffffL;
private int[] multiplyToLen(int[] x, int xlen, int[] y, int ylen, int[] z) {
int xstart = xlen - 1;
int ystart = ylen - 1;
if (z == null || z.length < (xlen+ ylen))
z = new int[xlen+ylen];
long carry = 0;
for (int j=ystart, k=ystart+1+xstart; j>=0; j--, k--) {
long product = (y[j] & LONG_MASK) *
(x[xstart] & LONG_MASK) + carry;
z[k] = (int)product;
carry = product >>> 32;
}
z[xstart] = (int)carry;
for (int i = xstart-1; i >= 0; i--) {
carry = 0;
for (int j=ystart, k=ystart+1+i; j>=0; j--, k--) {
long product = (y[j] & LONG_MASK) *
(x[i] & LONG_MASK) +
(z[k] & LONG_MASK) + carry;
z[k] = (int)product;
carry = product >>> 32;
}
z[i] = (int)carry;
}
return z;
}
拿到结果的int数组后, 去除开头的0.
回答@醉酒剑秋(33787218)的问题:
为什么0至xstart-1和xstart要分开,直接放在一个循环里面行不行?
: 这个手工在纸上计算一下543*434就知道, 首先计算543*4, 这里只需考虑每一位的乘, 加上上一次的进位即可; 接着算543*3, 需要考虑每一位的乘, 加上上一次的进位, 再加上 结果位上已有的值. 目测如果初始化结果数组z全为0, 则可以只用下面的那个循环来做; 但是现在两个循环明显效率要高一点点(第一个循环少了+(z[k] & LONG_MASK)), 在这种基础类里性能可是很重要的.
还有为什么或运算0xFFFFFFFFL?直接相乘可以吗
: 是与0xFFFFFFFFL, 注意0xFFFFFFFFL是long型, 这里是把int型转为与它数值相等的long; 否则直接int*int是会溢出的.
更新
还是有些要补充的地方:
1. java里是没有无符号数的, 所以int最大值为0x7fffffff(只用了31bit); 而在上面的程序中, 实际是把int当作了无符号数来用, 充分使用了这32个bit, 所以中间结果的int是作为 (int数)&0xffffffffL来使用的, 从java int型角度来说是会溢出的.
2. 中间结果的long值也是会溢出的, 所以这里用的是无符号右移>>>. -1>>>31 =1
转载于:https://www.cnblogs.com/brayden/p/5262496.html
http://www.dewen.net.cn/q/13558/100阶乘相关推荐
- http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题
http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题 王老五 2 票 王老五 13 将一个单浮点数精确到千分位的程序 //舍入计算 精确到千分位 void ...
- http://www.dewen.net.cn/q/14665/个人感觉用二分法最完美的,需要操作系统支持随机读取指定一行的数据,貌似现在还不行,江湖救急呀...
http://www.dewen.net.cn/q/14665/个人感觉用二分法最完美的,需要操作系统支持随机读取指定一行的数据,貌似现在还不行,江湖救急呀 评论 (0) • 举报 (0) • 分享 ...
- http://www.dewen.net.cn/q/15807/java byte 疑问
http://www.dewen.net.cn/q/15807/java byte 疑问 罢巴 1 票 罢巴 252 看的是 java7 入门经典,第58页有一个关于byte类型变量初始化的问题,希望 ...
- http://www.dewen.net.cn/q/9980/JQuery AJAX GBK 编
http://www.dewen.net.cn/q/9980/JQuery AJAX GBK 编码 wpjsolo 1 票 wpjsolo 53 $.ajax({ type:"POST&qu ...
- http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转
http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转 车头灯 2 票 车头灯 28 我是学生,维护学校的网站,广外地带,大家可以搜一下. 在搜索引擎,google和百度 ...
- http://www.dewen.net.cn/q/6120/如何获取Java对象的大小
http://www.dewen.net.cn/q/6120/如何获取Java对象的大小 kenvi 1 票 kenvi 2078 在C或者C++里经常会通过sizeof来计算一个对象所占空间的大小, ...
- http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢
http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢 kwooshung 2 票 kwooshung 11 比如数据表"article" ...
- http://www.dewen.net.cn/q/15749/PHP求数组值相加(可重复)等于某值的所有组合
http://www.dewen.net.cn/q/15749/PHP求数组值相加(可重复)等于某值的所有组合 tieGump 1 票 tieGump 8 例如 $data = array(1,2,4 ...
- http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题
http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题 ovalpo 1 票 ovalpo 8 举例说明,例如有行文本,想找出由 << ...
最新文章
- python空字典对象相当于false吗_python怎么判断某一对象是否为字典
- spring boot actuator工作原理之http服务暴露源码分析
- session过期重新登陆_深入分析Session和Cookie-前端面试题
- day6作业--游戏人生
- Vivado定制DDR3 IP核注意事项
- 对二维数组排序 使得每行每列非递减
- 20155229《网络对抗技术》Exp2:后门原理与实践
- Red5服务器端报错:无法解析类型ResourcePatternResolver
- 【译】采用微前端架构
- 猴子数据分享微信域名防封技术
- n倍角公式的行列式形式与证明
- 直线扫描转换-DDA算法
- echars中国地图,省份名字居中
- 2016年计算机辅助设计试题,cad考试题「附答案」
- excel 导出PDF ExportAsFixedFormat函数 报错-2147024809 (0x80070057)
- 模糊提取器(Fuzzy Extractor)
- 51单片机按键:短按,长按,按下执行松开停止
- Qt开发高级进阶:如何拷贝生成后的文件到特定文件夹
- 维特比算法和beam search
- linux vi后不保存退出,linux下退出VI的方法:不保存退出
热门文章
- VD500潮湿压缩空气流量计0690 5001_A1_B1_C1_D1_E1_F1_G1_K1
- 测试开发实习日记(DAY1)
- Oracle EBS简介
- Arch Linux/其他 Linux 下给 Link2/LPC-Link2 调试器刷 CMSIS-DAP 和 J-Link 固件
- MySQL数据库事务基本介绍、四大特征、隔离界别的使用方法
- 331_S32K144 CAN FIFO初步
- python画矩阵热图_如何用python的matplotlib绘制热图
- 租船题库整理 - 简答题、论述题
- 苹果手机如何关闭自动续费_自动续费?教你这样一键关闭
- message:Error app.json app.json 未找到 public