#33893: C++先使用if迴圈構建思路,再進行濃縮


kk20180820@gmail.com (Wayne Yang)

學校 : 國立鳳山高級中學
編號 : 172018
來源 : [49.159.254.231]
最後登入時間 :
2024-03-16 17:31:07
d485. 我愛偶數 -- 板橋高中教學題 | From: [49.159.254.231] | 發表日期 : 2023-02-11 14:47

C++先使用if迴圈構建思路,再進行濃縮,我知道沒有直接把判別式帶進cout中好,但至少可以解題

濃縮完成後可以發現,%2恰好可以充當0,1之間的切換,而透過0,1我們可以決定哪些式子不會成立!!

((b-a+1)%2)*( (b%2)*((b-a)/2)+((b+1)%2)*((b-a)/2+1) ) + ((b-a)%2)*((b-a+1)/2)

前半段:
當(b-a)為偶數(=1),就會成立
並且
如果(b%2)成立,((b+1)%2)就會不成立,最終列印((b-a)/2)
反之則列印((b-a)/2+1)


後半段:
(b-a)為奇數,就會成立(=1)
並且
列印((b-a+1)/2)


最初是利用差值的結果去發想的
如果差值是奇數
舉例
1 4 差值3,有2個偶數
2 5 差值3,有2個偶數
答案會是(b-a+1)/2

如果差值是偶數
舉例
2 4 差值2,有2個奇數
1 3 差值2,有1個奇數 比 2 4 少1
就必須進一步檢查,a或b擇一(因為差值偶數就代表a,b同為奇數或者同為偶數)
這裡選擇a舉例
將a%2就能知道最後的答案是否會差1
進而選擇+1或不+1


Original if程式碼

/*
#include<iostream> using namespace std; int main(void){ unsigned long long a,b; cin>>a>>b; if((b-a)%2 == 0){ if(b%2 == 0){ cout<<(b-a)/2+1; }else{ cout<<(b-a)/2; } }else{ cout<<(b-a+1)/2; } return 0; }
*/
 
ZeroJudge Forum