java - 创建三角形数的奇怪行为

标签 java

Triangular number直到第 N 个已知总和收敛到

(n*(n+1))/2

测试一下:

public static void main(String[] args) {
    int n = 10;
    long solution = (n * (n + 1)) / 2;
    System.out.println("Num: " + n + " Solution: " + solution);
}

给予:

Num: 10 Solution: 55

如果我将数字增加到100000

int n = 100000;
long solution = (n * (n + 1)) / 2;
System.out.println("Num: " + n + " Solution: " + solution);

给予:

Num: 100000 Solution: 705082704

实际上应该是:

Num: 100000 Solution: 5000050000

将乘法更改为:

long solution = n;
solution = (solution * (n+1))/2;
System.out.println("Num: " + n + " Solution: " + solution);

似乎可以解决这个问题,但为什么 long Solution = (n * (n + 1))/2; 无法做到这一点?

最佳答案

您正在执行 int 算术,该算术在转换为 long 之前就溢出了。正如您所指出的,首先使用 long 表示 n 会强制执行 long 算术。数学完成后,值将提升为 long,这样就不会发生溢出。

当使用 int 表示 n 时,在结果转换为 long< 之前,将以 int 形式执行数学运算 作业。

关于java - 创建三角形数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868112/

相关文章:

java - 设置字符串格式以均匀显示

java - 在 Swing 中使用孟加拉字体

java - hibernate 。我们如何使用注释设置 PK/FK 的名称?

java - 将单选按钮添加到上下文菜单

java - 如何对内部类中的方法进行单元测试?

java - 如何模拟方法以返回某些内容而不是抛出异常(PowerMock?)

java - Spring ModelAttribute正确解析

java - 配置的XML解析器不会阻止也不限制外部实体的解析

java - ADF actionListener 不会在弹出窗口的表中触发

java - 如何使 "Enter"键的行为类似于在 JFrame 上提交