死循环

  • 死循环就是一个无法结束的循环。(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. Tensorflow机器学习入门——网络可视化TensorBoard

    一.在代码中标记要显示的各种量 tensorboard各函数的作用和用法请参考:https://www.cnblogs.com/lyc-seu/p/8647792.html import tensor ...

  2. Ubuntu14 安装JDK 8

    参考: [1]Ubuntu安装JDK7/JDK8 [2]Oracle官网安装JDK10 安装包安装 本文采用安装包安装方式 1.下载JDK安装包 JDK8下载 ,根据所使用系统选择安装包(这里选.ta ...

  3. Kibana7.3.2与ElasticSearch7.3.2的集成

    上接: Ubuntu18.04 ElasticSearch7.3.2集群搭建 上传二进制包解压到指定目录, 修改目录名 tar -xzvf tar xzvf kibana-6.3.2-linux-x8 ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:用于要弹出信息的按钮

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. QQ企业通-----客户端消息发送模块设计---知识点

    Guid.NewGuid 方法    初始化 Guid 结构的新实例. Guid 结构   表示全局唯一标识符 (GUID). Encoding..::.Unicode 属性 获取使用 Little- ...

  6. PaperReading20200222

    CanChen ggchen@mail.ustc.edu.cn   VS-GAE Motivation: With the publication of NAS101, researchers can ...

  7. 第二章:windows下搭建开发环境

    IDE ---- pycharm数据库 --- mysql.redis.elasticsearch开发环境 -- anaconda 第一节:pycharm的安装和简单使用...(网上一搜一大堆,所以没 ...

  8. 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件

    使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...

  9. body滚动时左侧菜单固定

    var top = $(".nav-frame").offset().top $(document).scroll(function(){ if($(this).scrollTop ...

  10. C# 篇基础知识6——文件和流

    计算机以文件的形式把数据存储在磁盘.光盘等存储设备上.文件的管理和操作是操作系统的一个重要组成部分,.NET 框架提供了一组功能强大的类,可以方便地对文件进行操作和管理. 1.文件操作相关的类 用于文 ...