紀錄一下幾個到處亂看亂學的東西
其實就跟下面一樣
延伸2 (不用a%2==0判斷奇偶數(shù))
接著這個也是 xor 的延伸那我們從這個角度想偶數(shù)+1就是奇數(shù)
當偶數(shù)轉成二進制的時候例如 10 => 1010、 12 => 1100最右邊的數(shù)一定是0因為我們知道二進制轉十進制是這樣的(2^n) + (2^(n-1))+ (2^(n-2)) + ... + 2^0如果最後的數(shù)是1的話 整個就是奇數(shù)
所以我們要的重點就是最右邊那個數(shù)(2^0)這時候我們用這個變數(shù)來跟1做 xor 就知道奇偶數(shù)了假設有一個數(shù)轉二進制是這樣 => 10100101111.....1那麼運算結果就為
我們藉由以下就可以回推原來的數(shù)為奇數(shù)或偶數(shù)了奇數(shù) ^ 奇數(shù) = 偶數(shù)奇數(shù) ^ 偶數(shù) = 奇數(shù) (幹我在寫啥小 明明是用and 怎麼變 xor )
由於不常寫題目 所以以下的東西可能對常寫題目的人感到不以為意
1.三元運算子
條件 ? 動作1 : 動作2
之前就滿常看到的東西,只是最近嘗試去了解,其實很簡單,就是if...else的概念而已。
如果想寫得簡潔一點的話就可以使用三元運算子。
例如:
#include<iostream> #include<string> int main(){ string str; getline(cin, str); str == "how are you" ? cout << "yeah i'm good" : cout << "sry i don't understand"; return 0; } |
#include<iostream> #include<string> int main(){ string str; getline(cin, str); if(str == "how are you"){ cout << "yeah i'm good"; } else{ cout << "sry i don't understand"; } return 0; } |
2.一行解最大公因數(shù)// 延伸: (交換變數(shù)並且不宣告temp) (不用a%2==0判斷奇偶數(shù))
while(a%=b^=a^=b^=a); cout << b; |
a %= b;
這個 %=
我相信有程式基礎的都能看懂
其實就是 a = a % b;
(a除以b取餘數(shù))
a ^= b;
主要是這個 ^=
能舉一反三的話就能知道
其實就是 a = a ^ b;
那這個 ^ 運算子是什麼呢?
這個我猜計概或離散數(shù)學會教
這叫 xor 全名是 exclusive or
若 p xor q ≡ r
則真值表如下
p | q | r |
True | True | False |
True | False | True |
False | True | True |
False | False | False |
簡單來說就是p、q相同的話就是False
不同的就是True
接著回到前面
a = a ^ b;
這步會把a跟b都轉成二進制
假設a = 10, b = 12;
則過程就是
1010 ^) 1100 0110 |
110轉回十進制就是6了
a = a ^ b; // 結果 a = 6
那一行解最大公因數(shù)的原理是什麼呢?
這個容許我先講解完延伸1
延伸1 (交換變數(shù)並且不宣告temp)
a = a ^ b;
b = a ^ b;
a = a ^ b;
用剛剛的例子算算看就知道了
a = 10, b = 12;
首先 a = a ^ b; // 結果 a = 6
1010 ^) 1100 0110 |
再來 b = a ^ b; // 結果 b = 10
0110 ^) 1100 1010 |
最後 a = a ^ b; //結果 a = 12
0110 ^) 1010 1100 |
很屌對吧! 都不敢相信還有這種操作
三行寫在一起就是
b^=a^=b^=a
所以一行解的過程就是重複的 交換...取餘數(shù)...交換...取餘數(shù)
其實就是輾轉相除法啦
在a等於0的時候 while就會跳掉了
而b就是最大公因數(shù)了
^) 00000000000....1 |