1、1逻辑思维与计算机解题逻辑思维与计算机解题教材第教材第4 4章章王瑀屏程序设计基础2任务任务1 1n输入一个数n,判断它是否是素数,是则输出“Yes”,否则输出“No”p是素数,当且仅当p仅有1和p两个因数从2到p-1都不能被p整除3任务任务1 1int main()输入整数n 检查n是否为素数 如果n是素数 输出“Yes”否则 输出“No”return 0;int n=0;cin n;假设n是素数枚举2到n-1的所有数 如果n能整除这个数 n不是素数bool bPrime=true;for(int i=2;i n;i+)if(n%i=0)bPrime=false;if(bPrime)else
2、cout Yes endl;cout No n;bool bPrime=true;for(int i=2;i n;i+)if(n%i=0)bPrime=false;if(bPrime)cout Yes endl;else cout No n;bool bPrime=true;for(int i=2;i n;i+)if(n%i=0)bPrime=false;if(bPrime)cout Yes endl;else cout No n;bool bPrime=true;for(int i=2;i*i=n;i+)if(n%i=0)bPrime=false;if(bPrime)cout Yes end
3、l;else cout No n;bool bPrime=true;for(int i=2;i*i=n;i+)if(n%i=0)bPrime=false;break;if(bPrime)cout Yes endl;else cout No endl;return 0;9回想一下回想一下n从任务描述中分析任务的输入、输出、变量,抽象出数学公式、逻辑步骤n使用数学库函数完成数学公式n使用分支和循环完成逻辑步骤n在任务1中,定义了两个变量n、bPrimen为输入为什么要定义变量bPrime?表现了一种什么思想?10任务任务2 2n四位同学中的一位做好事不留名,表扬信来了,校长问这四位是谁做的好事A说
4、:不是我B说:是CC说:是DD说:他胡说n已知三个人说的是真话,一个人说的是假话,找出做了好事的人11任务任务2 2n这个问题中的变量是什么?n人解决这一问题的时候是怎么做的?猜!n分别假设A、B、C、D做了好事,看看是否符合条件n变量:假设做了好事的同学char goodman;/A、B、C、D12任务任务2 2n利用关系表达式表达四个人所说的话说话人说话人说的话说的话关系表达式关系表达式A不是我不是我B是是CC是是DD他胡说他胡说goodman!=Agoodman!=Dgoodman=Dgoodman=C13任务任务2 2int main()枚举做好事的人 判断四个人的话如果有三句为真、一
5、句为假 输出做好事的人如果无解输出无解 return 0;bool A=(goodman!=A);bool B=(goodman=C);bool C=(goodman=D);bool D=(goodman!=D);char goodman=;for(char goodman=A;goodman=D;goodman+)if(A+B+C+D=3)cout 做好事的人是 goodman endl;for(goodman=A;goodman=D;goodman+)if(goodman=)cout 无解 endl;14任务任务2 2n利用字符型变量goodman表达做好事的人做好事的人做好事的人good
6、man取值取值AABBCCDD15任务任务2 2n能否利用整型变量gd表达?做好事的人做好事的人gd取值取值A0B1C2D316任务任务2 2int main()枚举做好事的人 判断四个人的话如果有三句为真、一句为假 输出做好事的人如果无解输出无解 return 0;bool solved=false;if(gd!=0)+(gd=2)+(gd=3)+(gd!=3)=3)cout 做好事的人是 gd endl;for(int gd=0;gd 4;gd+)if(!solved)cout 无解 endl;solved=true;cout 做好事的人是 A+gd endl;cout 做好事的人是 (c
7、har)(A+gd)endl;17任务任务2 2小结小结n变量不只可以表达一个变化的数值,还可以表达一种假设,用变量的变化表达一种假设的推翻到另一种假设的建立n每当希望记录一种变化的时候,再定义一个变量可以帮助完成任务变量定义+初始化改变变量的值判断变量的值18练习练习1 1n画长方形2 输入整数m、n,输出一个字符组成的长方形,57的例子如下:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC19练习练习2 2n特殊的数字1 从小到大输出如153这样的三位数,满足十进制每位的立方之和正好等于这个数20练习练习3 3n杨辉三角形 输入整数n,输入n行杨辉三角形,每行空格分隔
8、21任务任务3 3n某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析A、B至少有一人作案A、E、F三人中至少有两人参与作案A、D不可能是同案犯B、C或同时作案,或与本案无关C、D中有且仅有一人作案如果D没有参与作案,则E也不可能参与作案22任务任务3 3n用一个变量表达谁是罪犯char badman;/A-Fn很显然,AF这六个嫌疑人可能不只一个人是罪犯,用一个变量取A-F的形式不能表达谁是罪犯了n只好用6个变量分别表示AF是否是罪犯23任务任务3 3n利用整型变量A表达“A是否是罪犯”A是否是罪犯?是否是罪犯?A取值取值否否0是是124任务任务3 3n枚举所有的可能性:for(int A=0;
9、A=1;A+)for(int B=0;B=1;B+)for(int C=0;C=1;C+)for(int D=0;D=1;D+)for(int E=0;E=1;E+)for(int F=0;F=1;F+)A循环的循环体B循环的循环体C循环的循环体25任务任务3 3n为什么用整型变量,不用bool型变量?for(bool f=false;f=2!(A&D)(B&C)|(!B&!C)(C&!D)|(D&!C)C+D=1D|(!D&!E)27任务任务3 3n六句话都满足CC1&CC2&CC3&CC4&CC5&CC6CC1+CC2+CC3+CC4+CC5+CC6=628任务任务3 3int main(
10、)枚举所有共犯组合 判断六句案情分析如果六句都满足 输出共犯组合如果无解输出无解 return 0;/六层循环/六个逻辑表达式/一条if语句/六条if语句/设置一个变量判断29任务任务3 3n问号表达式逻辑表达式?表达式A:表达式B如果逻辑表达式为真,问号表达式取表达式A的结果,否则取表达式B的结果n不建议使用!cout (A=0)?A不是罪犯:A是罪犯)endl;30任务任务3 3n一定要用六层循环吗?n回忆一下练习2是怎么做的?循环,从100到999,拆分出3位数,求立方和,判断与原数是否相等n用一个6位2进制数的每1位分别表示A-F是否是罪犯31任务任务3 3int main()枚举所有
11、共犯组合 提取六人的情况判断六句案情分析如果六句都满足 输出共犯组合如果无解输出无解 return 0;/从0000002到1111112/六个逻辑表达式/一条if语句/六条if语句/设置一个变量判断/怎么提取?32任务任务3 3n比如,取1011002从右边数第3位(n/4)%2n回忆一下,10进制的情况?(n/10)%10:取十位数33位运算位运算1 1意义意义写法写法混淆写法混淆写法a交交ba&ba&ba并并ba|ba|b反反aa!aa异或异或ba b34位运算位运算1 1n尝试一下:cout (5&3)endl;cout (5&3)endl;cout (5|3)endl;cout (5
12、|3)endl;cout (5)endl;cout (!5)endl;cout (5 3)endl;35位运算位运算2 2意义意义写法写法混淆写法混淆写法a左移左移b位位a bcout bcout b36位运算位运算2 2n尝试一下:cout (5 3)endl;cout 3)2)&1(n&4)2n好像差不多?n但是第二种在计算机中运算更快!n其实,这都是浮云,功能正确才是王道38讨论题(教材讨论题(教材p62p62,习题,习题3 3)n5位跳水高手将参加10m高台跳水决赛,有好事者让5人据实力预测比赛结果A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一。n决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错39结束结束