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阶乘相关推荐

  1. http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题

    http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题 王老五 2 票 王老五 13 将一个单浮点数精确到千分位的程序 //舍入计算 精确到千分位 void ...

  2. http://www.dewen.net.cn/q/14665/个人感觉用二分法最完美的,需要操作系统支持随机读取指定一行的数据,貌似现在还不行,江湖救急呀...

    http://www.dewen.net.cn/q/14665/个人感觉用二分法最完美的,需要操作系统支持随机读取指定一行的数据,貌似现在还不行,江湖救急呀 评论 (0) • 举报 (0) • 分享 ...

  3. http://www.dewen.net.cn/q/15807/java byte 疑问

    http://www.dewen.net.cn/q/15807/java byte 疑问 罢巴 1 票 罢巴 252 看的是 java7 入门经典,第58页有一个关于byte类型变量初始化的问题,希望 ...

  4. 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 ...

  5. http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转

    http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转 车头灯 2 票 车头灯 28 我是学生,维护学校的网站,广外地带,大家可以搜一下. 在搜索引擎,google和百度 ...

  6. http://www.dewen.net.cn/q/6120/如何获取Java对象的大小

    http://www.dewen.net.cn/q/6120/如何获取Java对象的大小 kenvi 1 票 kenvi 2078 在C或者C++里经常会通过sizeof来计算一个对象所占空间的大小, ...

  7. http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢

    http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢 kwooshung 2 票 kwooshung 11 比如数据表"article" ...

  8. 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 ...

  9. http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题

    http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题 ovalpo 1 票 ovalpo 8 举例说明,例如有行文本,想找出由 << ...

最新文章

  1. python空字典对象相当于false吗_python怎么判断某一对象是否为字典
  2. spring boot actuator工作原理之http服务暴露源码分析
  3. session过期重新登陆_深入分析Session和Cookie-前端面试题
  4. day6作业--游戏人生
  5. Vivado定制DDR3 IP核注意事项
  6. 对二维数组排序 使得每行每列非递减
  7. 20155229《网络对抗技术》Exp2:后门原理与实践
  8. Red5服务器端报错:无法解析类型ResourcePatternResolver
  9. 【译】采用微前端架构
  10. 猴子数据分享微信域名防封技术
  11. n倍角公式的行列式形式与证明
  12. 直线扫描转换-DDA算法
  13. echars中国地图,省份名字居中
  14. 2016年计算机辅助设计试题,cad考试题「附答案」
  15. excel 导出PDF ExportAsFixedFormat函数 报错-2147024809 (0x80070057)
  16. 模糊提取器(Fuzzy Extractor)
  17. 51单片机按键:短按,长按,按下执行松开停止
  18. Qt开发高级进阶:如何拷贝生成后的文件到特定文件夹
  19. 维特比算法和beam search
  20. linux vi后不保存退出,linux下退出VI的方法:不保存退出

热门文章

  1. VD500潮湿压缩空气流量计0690 5001_A1_B1_C1_D1_E1_F1_G1_K1
  2. 测试开发实习日记(DAY1)
  3. Oracle EBS简介
  4. Arch Linux/其他 Linux 下给 Link2/LPC-Link2 调试器刷 CMSIS-DAP 和 J-Link 固件
  5. MySQL数据库事务基本介绍、四大特征、隔离界别的使用方法
  6. 331_S32K144 CAN FIFO初步
  7. python画矩阵热图_如何用python的matplotlib绘制热图
  8. 租船题库整理 - 简答题、论述题
  9. 苹果手机如何关闭自动续费_自动续费?教你这样一键关闭
  10. message:Error app.json app.json 未找到 public