死循环(endless loop)
死循环
- 死循环就是一个无法结束的循环。(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)的更多相关文章
- 2015多校.MZL's endless loop(欧拉回路的机智应用 || 构造)
MZL's endless loop Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- hdu5348 MZL's endless loop(欧拉回路)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud MZL's endless loop Time Limit: 3000/1500 ...
- Hdu 5348 MZL's endless loop (dfs)
题目链接: Hdu 5348 MZL's endless loop 题目描述: 给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)< ...
- 图论 HDOJ 5348 MZL's endless loop
题目传送门 /* 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜, ...
- 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 ...
- [2015hdu多校联赛补题]hdu5348 MZL's endless loop
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1, ...
- HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
题意: 给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 网络流也是可以解决的!!应该挺简单理解的.但是由于复 ...
- HDU 5348 MZL's endless loop
乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #incl ...
- HDU 5348 MZL's endless loop(DFS去奇数度点+欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给你一张图,有n个点,和m条无向边,让你把m条无向边变成有向边,使得每个节点的|出度- ...
随机推荐
- window查看连接过的无线密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | find ...
- Sublime设置html头部
1.Ctrl + N,新建一个文档:2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式:3.输入 !,再按下 Tab键或者 Ctrl + ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:水平表单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 使用 sp_attach_db 系统存储过程附加数据库时---转载
//附加数据库 sp_attach_db 当使用 sp_attach_db 系统存储过程附加数据库时. sp_attach_db:将数据库附加到服务器. 语法 sp_attach_db [ @dbna ...
- Linux命令:cp命令
cp命令作用:拷贝文件和目录 一.格式 cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION].. ...
- Linux centos7 shell特殊符号、cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号
一.shell特殊符号.cut命令 *任意字符 [root@davery ~]# ls /tmp/*.txt/tmp/1.txt /tmp/2.txt /tmp/q.txt[root@davery ~ ...
- oracle随机生成时间
Julian Date定义 Julian Date:有效的日期范围是从公元前4713年1月1日到公元9999年12月31日.儒略日(julian date)是自公元前4713年1月1日中午12时起经过 ...
- Day3-N - Monthly Expense POJ3273
Farmer John is an astounding accounting wizard and has realized he might run out of money to run the ...
- SpringBoot 解决“不支持发行版本xx”的问题
原因:很多地方都要配置jdk版本,某些地方配置的jdk版本不同.比如你要使用jdk8,某些地方配成了jdk7. 最常见配置错的地方:Ctrl+Shift+Alt+S 如果没问题,查看Project中的 ...
- redis.rpm 安装
yum install jemalloc wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/redis-3.0.7 ...