例题1-4:鸡兔同笼
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出“ No answer”(不要引号)。
样例输入:14 32
样例输出:12 2
样例输入:10 16
样例输出: No answer
【分析】
设鸡有a只,兔有b只,则a+b=m,2a+4b=m,联立解得a=(4n-m)/2,b=n-a。在什么情况下此解“不算数”呢?首先,a和b都是整数:其次,a和b必须是非负的。可以通过下面的程序判断:
n = int(input('n:'))
m = int(input('m:'))
a = (4*n-m)/2
b = n-a
if (m%2 == 1 or a<0 or b<0):
print('No answer')
else:
print('a:%d\nb:%d'%(a,b))
换句话说,m%2=1 or a<0 or b<0是一个表达式,它的字面意思是“m是奇数,或者a小于0,或者b小于0”。这句话可能正确,也可能错误。因此这个表达式的值可能为真,也可能为假,取决于m、a和b的具体数值。
这样的表达式称为逻辑表达式。和算术表达式类似,逻辑表达式也由运算符和值构成,例如“or”运算符称为“逻辑或”,a or b表示a为真,或者b为真。换句话说,a和b只要有一个为真,a or b就为真;如果a和b都为真,则a or b也为真。
例题1-5:三整数排序
输入3个整数,从小到大排序后输出。
样例输入:20 7 33
样例输出:7 20 33
【分析】
a、b、c 3个数一共只有6种可能的顺序:abc、acb、bac、bca、cab、cba,所以最简单的思路是使用6条if语句。
三整数排序(1)
a = int(input('a:'))
b = int(input('b:'))
c = int(input('c:'))
if (a<=b and b<=c):
print('%d %d %d'%(a,b,c))
elif (a<=c and c<=b):
print('%d %d %d'%(a,c,b))
elif (b<=a and a<=c):
print('%d %d %d'%(b,a,c))
elif (b<=c and c<=a):
print('%d %d %d'%(b,c,a))
elif (c<=a and a<=b):
print('%d %d %d'%(c,a,b))
else:
print('%d %d %d'%(c,b,a))
三整数排序(2)
另一种思路是把a、b 、c 这 3 个变量本身改成a<= b<= c的形式。首先检査a 和 b 的值, 如 果 a > b ,则交换a 和 b (利用前面讲过的三变量交换法);接下来检査a 和 c , 最后检查b 和 c , 程序如下:
a = int(input('a:'))
b = int(input('b:'))
c = int(input('c:'))
t=0
if a>b:
t=a
a=b
b=t
if a>c:
t=a
a=c
c=t
if b>c:
t=b
b=c
c=t
print('%d %d %d'%(a,b,c))
三整数排序(3)
最后一种思路再次利用了 “问题求解”这一目标—— 它实际上并没有真的进行排序:求出了最小值和最大值,中间值是可以计算出来的。
a = int(input('a:'))
b = int(input('b:'))
c = int(input('c:'))
#x为当前最小值
x = a
if b<x:
x = b
if c<x:
x = c
#z为当前最达值
z = a
if b>z:
z = b
if c>z:
z = c
y = a+b+c-x-z
print('%d %d %d'%(x,y,z))
参考资料:《算法竞赛入门经典》
网友评论