例題1-4:雞兔同籠
已知雞和兔的總數(shù)量為n,總腿數(shù)為m壳澳。輸入n和m,依次輸出雞的數(shù)目和兔的數(shù)目。如果無解,則輸出“ No answer”(不要引號(hào))嗤详。
樣例輸入:14 32
樣例輸出:12 2
樣例輸入:10 16
樣例輸出: No answer
【分析】
設(shè)雞有a只,兔有b只,則a+b=m,2a+4b=m,聯(lián)立解得a=(4n-m)/2,b=n-a个扰。在什么情況下此解“不算數(shù)”呢?首先,a和b都是整數(shù):其次,a和b必須是非負(fù)的〈猩可以通過下面的程序判斷:
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是一個(gè)表達(dá)式,它的字面意思是“m是奇數(shù)冬筒,或者a小于0恐锣,或者b小于0”。這句話可能正確舞痰,也可能錯(cuò)誤土榴。因此這個(gè)表達(dá)式的值可能為真,也可能為假响牛,取決于m玷禽、a和b的具體數(shù)值。
這樣的表達(dá)式稱為邏輯表達(dá)式呀打。和算術(shù)表達(dá)式類似矢赁,邏輯表達(dá)式也由運(yùn)算符和值構(gòu)成,例如“or”運(yùn)算符稱為“邏輯或”贬丛,a or b表示a為真撩银,或者b為真。換句話說豺憔,a和b只要有一個(gè)為真额获,a or b就為真;如果a和b都為真恭应,則a or b也為真抄邀。
例題1-5:三整數(shù)排序
輸入3個(gè)整數(shù),從小到大排序后輸出昼榛。
樣例輸入:20 7 33
樣例輸出:7 20 33
【分析】
a境肾、b、c 3個(gè)數(shù)一共只有6種可能的順序:abc胆屿、acb奥喻、bac、bca莺掠、cab衫嵌、cba读宙,所以最簡單的思路是使用6條if語句彻秆。
三整數(shù)排序(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))
三整數(shù)排序(2)
另一種思路是把a(bǔ)、b 、c 這 3 個(gè)變量本身改成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))
三整數(shù)排序(3)
最后一種思路再次利用了 “問題求解”這一目標(biāo)—— 它實(shí)際上并沒有真的進(jìn)行排序:求出了最小值和最大值扎附,中間值是可以計(jì)算出來的蔫耽。
a = int(input('a:'))
b = int(input('b:'))
c = int(input('c:'))
#x為當(dāng)前最小值
x = a
if b<x:
x = b
if c<x:
x = c
#z為當(dāng)前最達(dá)值
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))
參考資料:《算法競賽入門經(jīng)典》