为什么Long无法接受12位数值,即使我明确宣布它?

unk*_*ror 4 java

import java.io.*;
import java.util.*;
public class Solution
{
    public static void main(String args[])
    {
            Scanner s=new Scanner(System.in);

            int k=s.nextInt();
            long  value=0L;

            value=(k-(k/2)) * (k/2);

            System.out.println(value);

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我输入的输入为1856378k,
预期输出为861534819721
但是我得到了-1753606775

为什么在价值长的时候给出错误答案

Sot*_*lis 6

在表达中

(k-(k/2)) * (k/2)
Run Code Online (Sandbox Code Playgroud)

没有long涉及的值,只有int值.因此,没有提升价值int.我们只是int算术.你的范围有限int.

如果k被宣布为a long,事情会有所不同

long k = s.nextInt();
Run Code Online (Sandbox Code Playgroud)

同样,您可以将表达式的某个值转换或声明为a long.

value = (k - (k / 2L)) * (k / 2);
Run Code Online (Sandbox Code Playgroud)

但这可能取决于相关性和执行顺序.它可以在这里工作,但不一定在其他表达式中.


Jon*_*eet 6

你正在分配给a long,但所有的算术都在完成int,因为表达式的每个部分(k-(k/2)) * (k/2)都是一个int.

最简单的解决方案是声明klong例如

long k = s.nextInt();
long value = (k-(k/2)) * (k/2);
Run Code Online (Sandbox Code Playgroud)

你也可以2L在任何一个除法运算中使用文字 - 它只是你需要使用long算术完成的乘法运算.

值得注意的是,赋值运算符右侧的计算与它分配给它的任何内容完全不同.