创建三角数的奇怪行为

gtg*_*ola 0 java

到达某个Nth 的三角数具有已知的汇总收敛

( 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);
}
Run Code Online (Sandbox Code Playgroud)

得到:

Num: 10 Solution: 55
Run Code Online (Sandbox Code Playgroud)

如果我将数字增加到 100000

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

得到:

Num: 100000 Solution: 705082704
Run Code Online (Sandbox Code Playgroud)

实际上应该是:

Num: 100000 Solution: 5000050000
Run Code Online (Sandbox Code Playgroud)

将乘法更改为:

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

似乎要解决它,但为什么不long solution = (n * (n + 1)) / 2;这样做呢?

rge*_*man 5

你正在执行int算术,它在转换为a之前会溢出long.正如您所指出的那样,首先使用longfor n强制long算术.数学完成后,值将被提升为long,此处不会发生溢出.

使用intfor时n,数学int在结果转换为long赋值之前执行为s .