博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数值溢出(arithmetic overflow)问题与解决方案
阅读量:5145 次
发布时间:2019-06-13

本文共 734 字,大约阅读时间需要 2 分钟。

0. 典型场景

  • 两数相加(乘法)、两数相减、一个数的阶乘,一个数的幂,这些统统可能造成数值的溢出;
  • 避免数值溢出的方法:
    • 当把一个计算出的很大的数赋值给一个 int(2^31-1)类型变量存储时,一般会溢出,这个时候可以采用取模的方式进行溢出的避免;

如,不能用表达式 xy<0 取代 x<yxy 可能会造成数值溢出,同样地也不能用表达式 y<x,在补码表示中正数和负数(+0和-0 是不同的数)的范围是不对称的。

1. 求最小公倍数

  • 根据最大公约数求最小公倍数;

    lcm(a,b)=abgcd(a,b)

    int gcd(int a, int b);int lcm(int a, int b){    return (a * b)/gcd(a, b);}

    数学意义上确实没有异议,但在编程实现时,考虑到计算机表示能力的限制,计算最小公倍数时,中间需要计算二者的乘积 a*b,乘法容易造成数值的上溢;

    int lcm(int a, int b){    return a * (b / gcd(a, b));}

2. 求组合数时

(nr)=n!(nr)!r!

中间的 n! 在某些输入的情况下,其值也会十分可观(上溢)。

此时可以使用递归式计算组合数:

(nr)=(n1r)+(n1r1)

int comb(int n, int r){    if (n == r) return 1;    if (n == 0 || r == 0) return 1;    return comb(n - 1, r) + comb(n - 1, r - 1);}

转载于:https://www.cnblogs.com/mtcnn/p/9423941.html

你可能感兴趣的文章
反射机制
查看>>
CocoaPod
查看>>
css3实现漂亮的按钮链接
查看>>
[python基础] python 2与python 3的区别,一个关于对象的未知的坑
查看>>
BZOJ 1251: 序列终结者 [splay]
查看>>
云的世界
查看>>
初识DetNet:确定性网络的前世今生
查看>>
5G边缘网络虚拟化的利器:vCPE和SD-WAN
查看>>
MATLAB基础入门笔记
查看>>
【UVA】434-Matty&#39;s Blocks
查看>>
五、宽度优先搜索(BFS)
查看>>
运行一个窗体直接最大化并把窗体右上角的最大化最小化置灰
查看>>
Android开发技术周报 Issue#80
查看>>
hadoop2.2.0+hive-0.10.0完全分布式安装方法
查看>>
WebForm——IIS服务器、开发方式和简单基础
查看>>
小实验3:实现haproxy的增、删、查
查看>>
Angular中ngModel的$render的详解
查看>>
读《格局》| 未到年纪的真理
查看>>
[转]《城南旧事》里的《送别》
查看>>
07动手动脑
查看>>