最近几次碰到乘法溢出,

情况一:

下面是修订后的版本

void dfs(int pos, int lim, int val, int div)

{

int i,j;

if(pos>prime[0]||prime[pos]>lim) return;

int t=prime[pos];

for(i=1,j=1; i<=lim/t;j++){

i*=t;

divisor[val*i]=div*(j+1);

dfs(pos+1,lim/i,val*i,div*(j+1));

}

dfs(pos+1,lim,val,div);

}

原来的版本是for(i=1,j=1; i*t<=lim;j++),结果i*t溢出变成负数导致divisor[val*i]的下标为负

情况二多一个乘法,导致顾此失彼: LIMIT 是500000,在下面的for循环

for(t=prime[ob.ind];t<=LIM/ob.cur;t*=prime[ob.ind])

t是第4793个质数46349,ob.cur为8,导致t*=prime[ob.ind]会产生乘法溢出(超过2^31-1),其实t<=LIM/ob.cur已经是为了避免乘法溢出的做法,结果还是没有考虑到后面的乘法。

程序运行最终产生了access violation(VC),因为divs[t*ob.cur]的下标出现了一个大负数。

解决的办法:因为这是都不超过int的范围,将相关类型扩展成long long就解决了。当然也可以采用上面的方式。

struct frame{

int ind,cur,cur_div;

frame(int i,int c, int d):ind(i),cur(c),cur_div(d){}

};

void dfs(int ind, int cur, int cur_div)

{

stackst;

st.push(frame(ind,cur,cur_div));

while(!st.empty()){

frame ob=st.top();

st.pop();

if(ob.ind==prime[0]+1 || ob.cur>LIM/prime[ob.ind]) continue;

st.push(frame(ob.ind+1,ob.cur,ob.cur_div));

int t,tot=1;

for(t=prime[ob.ind];t<=LIM/ob.cur;t*=prime[ob.ind]){

tot+=t;

divs[t*ob.cur]=ob.cur_div*tot;

st.push(frame(ob.ind+1,ob.cur*t,ob.cur_div*tot));

}

}

}

最新的情况

要求 prime[i]^p * prime[i+k]^(p+t)<=10^9  prime[i+k]^(p+t)本身可能超过10^9,对数取整也许可以解除所有溢出烦恼,唯一不确定的就是浮点类型精度是损失是否会带来不可接受的误差

p*log10((double)prime[i])+(p+t)*log10((double)prime[i+k])<=9.0

阅读(1957) | 评论(0) | 转发(0) |

mysql做乘法运算溢出_乘法溢出及对策相关推荐

  1. java long 溢出_关于溢出:Java乘法运算行为

    我编写了一种方法,可以将给定的数字从几天转换为毫秒: private long expireTimeInMilliseconds; ... public void setExpireTimeInDay ...

  2. python做乘法运算定律_《乘法运算定律》(一)教学设计

    <乘法运算定律>(一)教学设计 盘锦市兴隆台区第八小学 郑莹 教学目标 1.引导学生探索和理解乘法交换律.结合律,能运用运算定律进行一些简便计算. 2.培养学生根据具体情况,选择算法的意识 ...

  3. mysql做kv数据库_从零开始写KV数据库:基于哈希索引

    前言 新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb.Hbase等都是基于日志结构的存储引擎.最近我在看<数据密集型应用系统设计>,里面有一章专门在讲日志结构的存储引擎的 ...

  4. java 缓冲区溢出_缓冲区溢出详解

    1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...

  5. python做乘法运算定律_最新乘法运算定律专项练习题

    精品文档 精品文档 四年级乘法运算定律专项练习 姓名: 一. 乘法交换律.乘法结合律 1 .乘法交换律:交换两个因数的位置,积不变.用字母表示为: a × b = b × a 2 . 多个数相乘, 任 ...

  6. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析

    隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...

  7. mysql做kv数据库_如何将SQL数据映射到KV数据库

    日常吐槽 国外文章也不是都是好文章啊,不要见到英文就觉得高大上了-- 前言 越来越多的关系型数据库底层选择基于KV构建,例如TiDB的TiKV(RocksDB),cockroach的levelDB,M ...

  8. python做乘法运算定律_四年级乘法运算定律-

    一.知识梳理. 1. 加法运算定律. ( 1 )加法交换律:两个加数交换位置,和不变. 用字母表示: a+b=b+a ( 2 )加法结合律:三个数相加,先把前两个数相加,或者先把后两个数相加,和 不变 ...

  9. java bufferedimage 内存溢出_内存溢出使用ImageIO.write

    我让我的saveScreenShot线程内存溢出错误,即使是BlockingQueue的空内存溢出使用ImageIO.write在我的主要 存在时,下列变量存储图像 public static Blo ...

最新文章

  1. Python Scrapy
  2. vue实现一个星级打分效果_五分钟用vue实现一个五星打分效果
  3. Windows驱动开发 - 派遣函数
  4. 前端学习(2336):angular之传递参数
  5. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
  6. 使用expect编写脚本
  7. vs2013使用记录
  8. 区分指针数组和数组指针
  9. Postman设置环境变量
  10. html 判断输入的是手机号码,用js验证手机号码格式是否正确
  11. phpQuery占用过多内存的解决方法
  12. Godot Timer节点
  13. 百利药业IPO过会:扣非后年亏1.5亿 奥博资本是股东
  14. 如何下载浏览器中的flash 视频
  15. 央企招聘:中国航空油料集团2023公开招聘
  16. android 手机左右移动图片轮播,js实现支持手机滑动切换的轮播图片效果实例
  17. 如果张柏芝的孩子长大
  18. XDOJ综合题 数字分解排序
  19. 近日我方收到大量用户QQ发送涉黄图低俗等文字,腾讯QQ回应疑似被盗号!
  20. ROS系统SLAM基础学习:gazebo仿真机器人自主导航

热门文章

  1. JAVA对象JSON数据互相转换的四种常见情况
  2. Python TCP服务器
  3. 想念一个人是一种温馨,被别人想念是一种幸福
  4. SharePoint2010 连接配置数据库字符串保存位置(转)
  5. hdu2844 Coins(普通的多重背包 + 二进制优化)
  6. 中国医学不能走西方道路
  7. SegmentFault无法访问,因出现违规内容被网警要求停机!
  8. 你以为工厂模式很简单,可能是因为你懂的只是冰山的一角
  9. 刘朋:从技术到管理 - 团队制胜六步工作法(开篇)
  10. JeecgBoot 2.4 微服务正式版发布,基于SpringBoot的低代码平台