使用De Morgan德摩根定律理解代码

德摩根定律

非(P 且 Q)=(非 P)或(非 Q)
非(P 或 Q)=(非 P)且(非 Q)

!(x && y) → !x || !y
!(x || y) → !x && !y

举个例子,求三个数最小值算法

if (x < y && x < z)
    min = x;
else if (y < z)
    min = y;
else
    min = z;

我们现在利用De Morgan法则来看看,

第一条if,判断x < y && x < z,如果是真则最小值是x,这很好理解,关键是下面执行到else if (y < z)的条件是什么呢?自然是!(x < y && x < z)=x>=y || x >=z,所以如果运行到此步,就说明x一定比y,z这两个数的其中一个大,所以一定不是最小值,排除掉,接下来只要再判断y和z的大小就行了。

时间: 2024-10-11 17:44:24

使用De Morgan德摩根定律理解代码的相关文章

洞悉find中的德摩根定律和条件权限perm

1.德摩根定律 (1)初悉德摩根定律儿 在命题逻辑和逻辑代数中,德·摩根定律(或称德·摩根定理)是关于命题逻辑规律的一对法则. 奥古斯塔斯·德·摩根首先发现了在命题逻辑中存在着下面这些关系: 非(A 且 B) = (非 A) 或 (非 B)非(A 或 B) = (非 A) 且 (非 B) (2)图解德摩根定律 1>.非(A or B) = (非 A) and (非 B) 约定以下图中矩形代表全部,圆A和圆B是矩形的一部分并有部分相交 1)A or B,如下图中的黑色部分:     属于A或者是属

以洪荒之力打开linux德·摩根定律

德·摩根定律让学习liunx的小伙伴绕得头疼,现在我就用洪荒之力为大家理顺一下这个定律. 由图片可以看出, A=4+3 B=3+2 非A=2+1 非B=4+1 A且B就是代表既是A又是B的地方,A和B都有色块3,所以色块3代表了A且B 同时,我们再看A=4+3 ,B=3+2,我们可以推断出,且运算的结果就是两个算数式中重复的数字. A且B=3 A或B就是代表可以是A的部分,也可以是B的部分,所以色块2,3,4的和代表了A或B的范围.再看A=4+3,B=3+2,我们可以推断出,或运算的结果就是两个

德·摩根定律详解

一. 德·摩根定律 非(A且B) = (非A) 或(非B) 非(A 或B) = (非A) 且(非B) 1.德·摩根定律确实让人头疼,下面为大家具体详解 由图片可知 A=1+2 ;B=2+3 ;c=4 非A=3+4 非B=1+4 A且B 是同时是A,也同时是B,所以A且B=2 A或B 既可以是A,也可以是B,所以A或B=1+2+3 所以 非(A且B) =1+3+4  (非A) 或(非B) =3+4+1 得    非(A且B) = (非A) 或(非B) 同理可知 非(A 或B) = (非A) 且(非

poj水题-3062 超级水题的深层理解——代码简化

题目很简单,要求输入什么样输出什么样.以回车结束 这就是我用的C代码 #include <stdio.h> int main (){char p;for(;gets(&p);)puts(&p);return 0;} 使用了代码简化方案,我简化到了75B.有大神简化到31B,真想看看他们的源代码.我估计他们比我个能够了解语言规则. 这里不得不说一本叫<短码之美>的书.介绍了这道题.但我试过了,没用.可能系统升级了吧,必须要求C99. ,还听说不用#include也行,

学习方法:面对&#39;自己理解代码’ 与 ‘实际代码样式’有区别时的解决方案

敲代码过程中,我们经常会遇到一些代码问题,这些代码问题涉及到逻辑的偏差,就会遇到, '我看到代码,脑海中运行了一遍,结果是没问题的',但是实际上,'代码的运行流程结果与我所理解的'出现了区别 来,例子呈上来: 1.'我理解中的效果'代码献上:(看行数拼接) 2.进行测试结果: 3.检查代码: 输出结果: 4.第二次检查代码: 输出结果: 5.找到问题之后,我们进行更改: 输出结果: 心得: 为了解决这个问题,自己也多花了一点时间呢,所以: (1) 面对结果不是我们想要的时候,不要用[自己的理解]

证明德摩根第一定律

定理: 证明过程演绎法: 原文地址:https://www.cnblogs.com/zhulinmails/p/12375985.html

JAVA装饰者模式(从现实生活角度理解代码原理)

装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. (2)处理那些可以撤消的职责. (3)当不能采用生成子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类. 实现该模式的关键步骤: (1)Component(被装饰对象基类

理解代码的二进制级别重用

在软件开发中,经常提到源代码重用,Dll重用等概念,而代码的二进制级别重用则相对晦涩.本文将从软件发布的角度一步一步讲解二进制级别重用的内涵,希望对大家有帮助.需要说明的是,在行文过程中,默认使用了C++作为程序开发语言. 一.源代码重用 源代码重用是指软件厂商提供包含头文件和源文件的完整代码供客户使用.比如,一软件厂商发布一个类库源代码(CMath四则运算).此时,在开发客户应用程序时,需要引用CMath的头文件和源文件,编译得到的应用程序中包含CMath对应的二进制代码.若CMath类所产生

ACM图论—最小环问题 ( 仔细分析+理解+代码 )(HDU 1599 ) (POJ 1743)

说明:如果发现错误或者有任何问题,任何不理解的地方请评论提出,或私信me,^ _ ^ ACM-图论 最小环问题(Floyd算法应用) 最小环问题是Floyd算法的应用,并不难,和Floyd算法一样难度.但是如果要输出最小环路径就要稍微麻烦一点,也不难. 1.计算最小环值(HDU 1599) 有向图最小环: 有向图最小环最少要有2个点组成环,这个的写法就是用Floyd()求最短距离,最后所有点中的最短距离的最小值就是答案. 无向图最小环: 肯定和有向环做法有区别,无向图构成环最少要有3个点,所以求