如果您调试代码,您可以看到出现了什么问题。 “调试”的一种方法是插入print语句,因此在temp赋值后插入以下代码:

System.out.printf("l=%1$08x=%1$-10d r=%2$08x=%2$-10d mid=%3$08x=%3$-10d temp=%4$016x=%4$d%n", l, r, mid, temp);

if (temp < 0)

throw new IllegalStateException();

这将以十六进制和十进制打印4个值l,r,mid和temp,对齐以便于比较。插入if语句以在发生明显的内部错误时结束循环,并且它将触发。

调用isPerfectSquare(Integer.MAX_VALUE)时的输出:

l=00000000=0 r=40000000=1073741824 mid=20000000=536870912 temp=0000000000000000=0

l=20000001=536870913 r=40000000=1073741824 mid=30000000=805306368 temp=0000000000000000=0

l=30000001=805306369 r=40000000=1073741824 mid=38000000=939524096 temp=0000000000000000=0

l=38000001=939524097 r=40000000=1073741824 mid=3c000000=1006632960 temp=0000000000000000=0

l=3c000001=1006632961 r=40000000=1073741824 mid=3e000000=1040187392 temp=0000000000000000=0

l=3e000001=1040187393 r=40000000=1073741824 mid=3f000000=1056964608 temp=0000000000000000=0

l=3f000001=1056964609 r=40000000=1073741824 mid=3f800000=1065353216 temp=0000000000000000=0

l=3f800001=1065353217 r=40000000=1073741824 mid=3fc00000=1069547520 temp=0000000000000000=0

l=3fc00001=1069547521 r=40000000=1073741824 mid=3fe00000=1071644672 temp=0000000000000000=0

l=3fe00001=1071644673 r=40000000=1073741824 mid=3ff00000=1072693248 temp=0000000000000000=0

l=3ff00001=1072693249 r=40000000=1073741824 mid=3ff80000=1073217536 temp=0000000000000000=0

l=3ff80001=1073217537 r=40000000=1073741824 mid=3ffc0000=1073479680 temp=0000000000000000=0

l=3ffc0001=1073479681 r=40000000=1073741824 mid=3ffe0000=1073610752 temp=0000000000000000=0

l=3ffe0001=1073610753 r=40000000=1073741824 mid=3fff0000=1073676288 temp=0000000000000000=0

l=3fff0001=1073676289 r=40000000=1073741824 mid=3fff8000=1073709056 temp=0000000040000000=1073741824

l=3fff8001=1073709057 r=40000000=1073741824 mid=3fffc000=1073725440 temp=0000000010000000=268435456

l=3fffc001=1073725441 r=40000000=1073741824 mid=3fffe000=1073733632 temp=0000000004000000=67108864

l=3fffe001=1073733633 r=40000000=1073741824 mid=3ffff000=1073737728 temp=0000000001000000=16777216

l=3ffff001=1073737729 r=40000000=1073741824 mid=3ffff800=1073739776 temp=0000000000400000=4194304

l=3ffff801=1073739777 r=40000000=1073741824 mid=3ffffc00=1073740800 temp=0000000000100000=1048576

l=3ffffc01=1073740801 r=40000000=1073741824 mid=3ffffe00=1073741312 temp=0000000000040000=262144

l=3ffffe01=1073741313 r=40000000=1073741824 mid=3fffff00=1073741568 temp=0000000000010000=65536

l=3fffff01=1073741569 r=40000000=1073741824 mid=3fffff80=1073741696 temp=0000000000004000=16384

l=3fffff81=1073741697 r=40000000=1073741824 mid=3fffffc0=1073741760 temp=0000000000001000=4096

l=3fffffc1=1073741761 r=40000000=1073741824 mid=3fffffe0=1073741792 temp=0000000000000400=1024

l=3fffffe1=1073741793 r=40000000=1073741824 mid=3ffffff0=1073741808 temp=0000000000000100=256

l=3ffffff1=1073741809 r=40000000=1073741824 mid=3ffffff8=1073741816 temp=0000000000000040=64

l=3ffffff9=1073741817 r=40000000=1073741824 mid=3ffffffc=1073741820 temp=0000000000000010=16

l=3ffffffd=1073741821 r=40000000=1073741824 mid=3ffffffe=1073741822 temp=0000000000000004=4

l=3fffffff=1073741823 r=40000000=1073741824 mid=3fffffff=1073741823 temp=ffffffff80000001=-2147483647

Exception in thread "main" java.lang.IllegalStateException

at Test.isPerfectSquare(Test.java:14)

at Test.main(Test.java:4)

如您所见,您的问题已在第一次迭代中发生,其中temp计算为0。

这是由0x2000_0000平方时的数字溢出引起的。它应该是0x0400_0000_0000_0000但它是0因为乘法是使用int数学完成的。

改为long数学,至少将其中一个演绎到long,例如:换线到long temp = (long)mid * mid;。

通过该更改,您的调试输出变为:

l=00000000=0 r=40000000=1073741824 mid=20000000=536870912 temp=0400000000000000=288230376151711744

l=00000000=0 r=1fffffff=536870911 mid=0fffffff=268435455 temp=00ffffffe0000001=72057593501057025

l=00000000=0 r=0ffffffe=268435454 mid=07ffffff=134217727 temp=003ffffff0000001=18014398241046529

l=00000000=0 r=07fffffe=134217726 mid=03ffffff=67108863 temp=000ffffff8000001=4503599493152769

l=00000000=0 r=03fffffe=67108862 mid=01ffffff=33554431 temp=0003fffffc000001=1125899839733761

l=00000000=0 r=01fffffe=33554430 mid=00ffffff=16777215 temp=0000fffffe000001=281474943156225

l=00000000=0 r=00fffffe=16777214 mid=007fffff=8388607 temp=00003fffff000001=70368727400449

l=00000000=0 r=007ffffe=8388606 mid=003fffff=4194303 temp=00000fffff800001=17592177655809

l=00000000=0 r=003ffffe=4194302 mid=001fffff=2097151 temp=000003ffffc00001=4398042316801

l=00000000=0 r=001ffffe=2097150 mid=000fffff=1048575 temp=000000ffffe00001=1099509530625

l=00000000=0 r=000ffffe=1048574 mid=0007ffff=524287 temp=0000003ffff00001=274876858369

l=00000000=0 r=0007fffe=524286 mid=0003ffff=262143 temp=0000000ffff80001=68718952449

l=00000000=0 r=0003fffe=262142 mid=0001ffff=131071 temp=00000003fffc0001=17179607041

l=00000000=0 r=0001fffe=131070 mid=0000ffff=65535 temp=00000000fffe0001=4294836225

l=00000000=0 r=0000fffe=65534 mid=00007fff=32767 temp=000000003fff0001=1073676289

l=00008000=32768 r=0000fffe=65534 mid=0000bfff=49151 temp=000000008ffe8001=2415820801

l=00008000=32768 r=0000bffe=49150 mid=00009fff=40959 temp=0000000063fec001=1677639681

l=0000a000=40960 r=0000bffe=49150 mid=0000afff=45055 temp=0000000078fea001=2029953025

l=0000b000=45056 r=0000bffe=49150 mid=0000b7ff=47103 temp=00000000843e9001=2218692609

l=0000b000=45056 r=0000b7fe=47102 mid=0000b3ff=46079 temp=000000007e8e9801=2123274241

l=0000b400=46080 r=0000b7fe=47102 mid=0000b5ff=46591 temp=0000000081629401=2170721281

l=0000b400=46080 r=0000b5fe=46590 mid=0000b4ff=46335 temp=000000007ff79601=2146932225

l=0000b500=46336 r=0000b5fe=46590 mid=0000b57f=46463 temp=0000000080acd501=2158810369

l=0000b500=46336 r=0000b57e=46462 mid=0000b53f=46399 temp=0000000080522581=2152867201

l=0000b500=46336 r=0000b53e=46398 mid=0000b51f=46367 temp=000000008024d9c1=2149898689

l=0000b500=46336 r=0000b51e=46366 mid=0000b50f=46351 temp=00000000800e36e1=2148415201

l=0000b500=46336 r=0000b50e=46350 mid=0000b507=46343 temp=000000008002e631=2147673649

l=0000b500=46336 r=0000b506=46342 mid=0000b503=46339 temp=000000007ffd3e09=2147302921

l=0000b504=46340 r=0000b506=46342 mid=0000b505=46341 temp=0000000080001219=2147488281

l=0000b504=46340 r=0000b504=46340 mid=0000b504=46340 temp=000000007ffea810=2147395600

false

java int过长_java - 为什么长,不是int否则限制时间超过 - SO中文参考 - www.soinside.com...相关推荐

  1. java中receive功能_java - 在onReceive()回调中的synchronized块 - SO中文参考 - www.soinside.com...

    我正在阅读this page关于如何编程Android与USB配件通信.其中一个步骤涉及注册BroadcastReceiver以获得用户的许可: IntentFilter filter = new I ...

  2. arg 0 什么 java_java - 在java中'predicate.arg(1)'和'predicate.arity'是什么意思? - SO中文参考 - www.soinside.com...

    我有一些java代码,我试图翻译成vb.net.它使用'谓词',这是我直到现在才知道的一个功能,但它也存在于vb.net中. 所以我阅读了它的文档,但没有一个解释我的java代码,具体来说,如果你有一 ...

  3. json解析嵌套jasn语句报错_java - Spring Boot:尝试解析Json时为InvalidTypeIdException - SO中文参考 - www.soinside.com...

    我正在尝试将POJO映射到我得到的JSON响应:但是,我不断收到此错误:com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could ...

  4. Java背景颜色怎么设成随机的_java - 如何将按钮的背景设置为具有设置约束的随机颜色? - SO中文参考 - www.soinside.com...

    这是错的: for (int i = 0; i < arrayButtons.length; i++) { arrayButtons[i].setDrawColor(new Color(rand ...

  5. java 三维旋转立方体_java - 如何通过旋转来计算立方体的所有方向,而不重复方向? - SO中文参考 - www.soinside.com...

    我正在研究一个应用程序,以找到给定特定起始结构的拼图立方体的可能解决方案的数量. 我将所有唯一的解决方案存储在内存中,将与给定结构进行比较,以确定可能有多少解决方案. 为此,我必须围绕每个面将立方体旋 ...

  6. 俄语转化成拉丁字母java_java - 如何在Java String中将西里尔字母转换为英语拉丁语? - SO中文参考 - www.soinside.com...

    我在stackoverflow Transliteration from Cyrillic to Latin ICU4j java上找到了这个方法,它用于将西里尔语(俄语)转换为拉丁语(但如果需要,你 ...

  7. 如何用Java制作hwid验证_java - 将帐户登录+ HWID锁定添加到Java程序的最安全方法是什么? - SO中文参考 - www.soinside.com...

    是的,你可以做到,但你需要重新设计你的应用程序.您应该将应用程序分成两个不同的应用程序.(简而言之:您还有很长的路要走) 1-客户端应用程序:Java应用程序与最终用户交互的位置. 2-服务器应用程序 ...

  8. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

    在我的Android应用程序,我想有一类处理所有"写入/读取到文本文件"的行动.所以,我根本就调用我的readUserFile.java文件我想的方法.但我的方法将不会在该文件中工 ...

  9. java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com

    Java游戏 - 如何让敌人移动? 问题描述 投票:1回答:2 我正在做一个射击游戏,并添加了许多带阵列的敌人,然后在地图上给他们一个随机位置,但我不知道如何让他们在到达他们的位置后移动.这是我的敌人 ...

  10. java方法未定义类型_java - 方法未定义为类 - SO中文参考 - www.soinside.com

    我试图在eclipse中运行一个使用名为getArea(一个对象)的方法的代码.我目前收到错误说 对于getArea(ComparableRectangle)类型,方法RectangleTest未定义 ...

最新文章

  1. UI培训教程分享:APP启动页UI界面设计
  2. linux C语言 socket如何判断socket_fd对应的socket是否断开?(是否连通、是否正常连接)recv()、tcp_info TCP_ESTABLISHED、keepalive
  3. linux 系统管理(二) 磁盘分区
  4. LVS(12)——sh
  5. JQuery[12] 模仿QQ聊天界面
  6. 从大厂出来后,我工资翻了一翻
  7. 拓端tecdat|R语言解决最优化问题-线性规划(LP)问题
  8. es6异步编程 Promise 讲解 --------各个优点缺点总结
  9. 后台管理系统PRD该怎么写?
  10. 【正点原子Linux连载】第六十五章 Linux 音频驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  11. 创业者2012必看十大文章(10)
  12. 电视直播Android9,电视直播高清Android 1.9免费版(移动电视直播工具)
  13. 微软远程桌面0x104_win10系统远程桌面出现错误0x204的解决方法
  14. 自动化测试练习项目环境搭建
  15. win10右键“新建”时响应速度非常缓慢怎么办
  16. hadoop和spark安装包 网盘地址
  17. html中字号调节,设置页面字体大小 怎么调整ps界面字体的大小
  18. 计算机水冷排原理,玩转水冷电脑 冷排是关键
  19. Excel之利用Excel的排序功能可以让表格整体按照某一列降序排列而排列(一)
  20. 高等数学、线性代数、概率论、几何这些知识可以用来干什么?

热门文章

  1. can总线rollingcounter_CAN总线笔记
  2. 前后端分离跨域上传图片代码
  3. 一文读懂Elephant Swap的LaaS方案的优势之处
  4. 通过漫画学习MySQL索引及优化
  5. 用ARCGIS做DEM地形分析
  6. 尚德机构COO杜铮:在线教育进入下半场 释放供给侧红利成关键
  7. android背光,Android背光亮度调节
  8. 使用CCS导出TXT用于BSL烧录
  9. Bug软件缺陷管理制度
  10. Android开发 个人开发者几大后端云比较