切換
舊版
前往
大廳
主題

紀錄些最近學到的程式小知識

魔化鬼鬼 | 2020-09-08 23:13:23 | 巴幣 8 | 人氣 387

紀錄一下幾個到處亂看亂學的東西
由於不常寫題目 所以以下的東西可能對常寫題目的人感到不以為意


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.一行解最大公因數// 延伸: (交換變數並且不宣告temp) (不用a%2==0判斷奇偶數)

while(a%=b^=a^=b^=a);
cout << b;

a %= b;
這個 %=
我相信有程式基礎的都能看懂
其實就是 a = a % b;
(a除以b取餘數)

a ^= b;
主要是這個 ^=
能舉一反三的話就能知道
其實就是 a = a ^ b;
那這個 ^ 運算子是什麼呢?

這個我猜計概或離散數學會教
這叫 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
那一行解最大公因數的原理是什麼呢?
這個容許我先講解完延伸1


延伸1 (交換變數並且不宣告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
所以一行解的過程就是重複的 交換...取餘數...交換...取餘數
其實就是輾轉相除法啦
在a等於0的時候 while就會跳掉了
而b就是最大公因數了


延伸2 (不用a%2==0判斷奇偶數)

接著這個也是 xor 的延伸
那我們從這個角度想
偶數+1就是奇數

當偶數轉成二進制的時候
例如 10 => 1010、 12 => 1100
最右邊的數一定是0
因為我們知道二進制轉十進制是這樣的(2^n) + (2^(n-1))+  (2^(n-2)) + ... + 2^0
如果最後的數是1的話 整個就是奇數

所以我們要的重點就是最右邊那個數(2^0)
這時候我們用這個變數來跟1做 xor 就知道奇偶數了
假設有一個數轉二進制是這樣 => 10100101111.....1
那麼運算結果就為
    10100101111.....1
^) 00000000000....1

    不重要...............0

我們藉由以下就可以回推原來的數為奇數或偶數了
奇數 ^ 奇數 = 偶數
奇數 ^ 偶數 = 奇數 (幹我在寫啥小 明明是用and 怎麼變 xor )


創作回應

更多創作