#4: py 不用if解


091031@stu.cchs.chc.edu.tw (02李承翰)

學校 : 不指定學校
編號 : 562
來源 : [140.112.240.49]
最後登入時間 :
2024-12-24 22:50:20
a024. 該減肥了! -- 板橋高中教學題 | From: [101.137.189.141] | 發表日期 : 2021-12-27 22:30

 

在此題中,50是分界線,也就是說,我們要把所有的數字分成0~50跟51~無限大兩個區域,且兩個區域帶進這運算只會得到兩種答案

如果體重是n (n-50.5)可以讓兩個區域分成正跟負 全正數要再轉成一樣的 而全負數要轉成一樣的

a/|a|這個東西可以讓正的輸出1 負的輸出-1

接下來就經過簡單的運算 可以讓1變成-1 -1變成0

 

自己思考一下~

 
#5: Re:py 不用if解


911091@stu.cchs.chc.edu.tw (17莊明達 David)

學校 : 彰化縣精誠中學
編號 : 4
來源 : [111.246.30.44]
最後登入時間 :
2023-06-10 18:41:31
a024. 該減肥了! -- 板橋高中教學題 | From: [163.23.124.189] | 發表日期 : 2021-12-30 10:31

 

在此題中,50是分界線,也就是說,我們要把所有的數字分成0~50跟51~無限大兩個區域,且兩個區域帶進這運算只會得到兩種答案

如果體重是n (n-50.5)可以讓兩個區域分成正跟負 全正數要再轉成一樣的 而全負數要轉成一樣的

a/|a|這個東西可以讓正的輸出1 負的輸出-1

接下來就經過簡單的運算 可以讓1變成-1 -1變成0

 

自己思考一下~


諸如"x > 10"、"y <= 12"這樣的判斷式,實際上是一個布林值,也就是true、false二擇一,又個別可以被轉換成1、0

因此,可以利用布林值true轉成1、false轉成0的特性,來達到不用if的解題

如: | z = (x>123)*123 + (x<=123)*x | ,此時如果 x>123,z=123,否則z=x

這種,以及其他消去程式中的if的技巧,叫做"Branchless Programming",可能會讓程式有極微小的提速(但也可能更慢),平時不會使用(差距微小,debug起來也更難)

 
ZeroJudge Forum