死循环

  • 死循环就是一个无法结束的循环。(endless loop / infinite loop)
  • 出现死循环是因为没有设置好结束条件,循环的结束条件很重要,要充分考虑各种边界情况

以上一篇随笔中的习题(找到 n 个可以被整除的数)为例,如果缺少累计次数的条件,那么就会让条件表达式永远满足,这样程序就会永远执行。这样就会产生一个死循环。

public class FindDivEndless {
public static void main(String[] args) {
int n = 5;
int dividend = 100;
int divisor = 89; int found = 0; while(found<n) {
if(dividend%divisor == 0) {
System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend/divisor));
}
dividend++;
}
}
}

一个特殊的例子

  • 用 while 找出 5 个能被 20 0000 0000 整除的数
  • 程序最终依然会结束
public class FindNDivNotEndless {
public static void main(String[] args) {
int n = 5; int dividend = 100;
int divisor = 2000000000; // 数值会溢出int的取值范围 int found = 0; while (found < n) { if (dividend % divisor == 0) {
found++;
System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend / divisor));
} dividend++;
}
}
}

出现这种情况的原因是,20亿接近 int 的最大取值,再往下累加就会导致数值溢出。

按照二进制的加法,那么加着加着,最高位就会是1,而在计算机中,二进制数值是用补码的形式表示和存储的,

因此最高位符号位是1时,就变成了负数,这就是为什么第二个找到的数是负数的原因。

于是,如果不仅仅找5个可以被整除的数时,就会不断的1、 -1、 0、 1、 -1 这样重复下去。

那么又如何解决数值溢出而产生负数结果的问题呢?

使用 break 语句结束循环

  • break语句可以结束任何循环
  • 不考虑负数的情况,使用 break 解决问题
public class FindNDivBetter {
public static void main(String[] args) {
int n = 5; int dividend = 100;
int divisor = 2000000000; int found = 0; String start = "从" + dividend + "开始,"; while (found < n) {
// 当被除数数值溢出时,跳出整个while循环。
if (dividend < 0) {
System.out.println("被除数溢出,计算结束!");
break;
} if (dividend % divisor == 0) {
found++;
System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend / divisor));
} dividend++;
} System.out.println(start + "共找到" + found + "个可以被" + divisor + "整除的数。");
System.out.println(dividend); // 结果是-2147483648,确实是一个负数。
}
}

死循环(endless loop)的更多相关文章

  1. 2015多校.MZL's endless loop(欧拉回路的机智应用 || 构造)

    MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  2. hdu5348 MZL's endless loop(欧拉回路)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's endless loop Time Limit: 3000/1500 ...

  3. Hdu 5348 MZL's endless loop (dfs)

    题目链接: Hdu 5348 MZL's endless loop 题目描述: 给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)< ...

  4. 图论 HDOJ 5348 MZL's endless loop

    题目传送门 /* 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜, ...

  5. 2015 Multi-University Training Contest 5 hdu 5348 MZL's endless loop

    MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  6. [2015hdu多校联赛补题]hdu5348 MZL's endless loop

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1, ...

  7. HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)

    题意: 给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 网络流也是可以解决的!!应该挺简单理解的.但是由于复 ...

  8. HDU 5348 MZL's endless loop

    乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #incl ...

  9. HDU 5348 MZL's endless loop(DFS去奇数度点+欧拉回路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给你一张图,有n个点,和m条无向边,让你把m条无向边变成有向边,使得每个节点的|出度- ...

随机推荐

  1. 获取进程对应的UID登陆用户

    getlogin获取登陆用户,守护进程调用出错 一个用户UID可以对应多个登陆名吗?貌似可以

  2. MySql数据库慢查询

    一.什么是数据库慢查询? 数据库慢查询,就是查询时间超过了我们设定的时间的语句. 可以查看设定的时间: 默认的设定时间是10秒.也可以自己根据实际项目设定. set long_query_time=0 ...

  3. 【剑指Offer面试编程题】题目1521:二叉树的镜像--九度OJ

    题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点 ...

  4. Linux 运维常用命令

    参考: https://segmentfault.com/a/1190000009745139 http://blog.51cto.com/xuqq999/774714 .查看有多少个IP访问: aw ...

  5. Angular4之时间管道

    {{时间戳 |date:“yyyy/MM/dd HH:mm:ss”}} “YYYY/MM/DD”不可

  6. Kubernetes——机密数据管理

    k8s——机密数据管理1.secret2.configMap kubectl explain secret    #查看帮助手册然后将你要加密的变量值做些许处理:echo 123 | base64   ...

  7. 嵊州普及Day5T4

    题意:两个1,每次可将一个*k,一个*K2,n个问题,问能否达成x,y? 思路:只有将x,y相乘为3次方时,才可能.并且相乘的三次方一定要是x,y的因子. 下面证明:3次方易证,因为对每个k,都会乘三 ...

  8. java字符集编码乱码问题

    博客分类: web javajspservlet  最近做网页这块时碰到了正文字符乱码问题.别看这小小的一个问题,对我来说却花费了好长一段时间.现在让我慢慢分析它吧(说实话.这些有部分是从网上找的,但 ...

  9. instance与可变参数合用,多态性

    public class Doubt { public static void main(String[] args) { Dog d1=new Dog(); Dog d2=new Zangao(); ...

  10. 三 Hibernate持久化状态&主键生成策略

    持久化类 持久化:将内存中的一个对象持久化到数据库中的过程 持久化类:Java类+映射文件.Java中一个类与数据库的表建立了映射关系,那么这个类称为持久化类. 持久化类的编写规则: 对持久化类提供一 ...