四則運算
在C++裡,四則運算大多就跟平常一樣。也遵從著先乘除後加減、括號先算……等等正常的運算規則。
在進行很大的數字相加/相乘時務必注意,若於運算中之任何時刻超過int可表示的範圍,即使最終答案在int範圍,也會導致overflow而使答案錯誤
1 | int a = 5, b = 3; |
結果:
1 | 8 2 15 |
除法
1 | int a = 5, b = 3; |
結果:
1 | 1 |
會有這樣的結果是因為,5是一個整數,3也是一個整數,整數之間的運算,結果在C++裡只會是整數。
因此,小數點以後的部分被捨棄了。
除以 0
在除以 0 時,程式會產生執行期間錯誤(Runtime Error),在 Online Judge 上顯示為 RE / Runtime Error / Segmentation fault。請務必注意此情形,並且預先處理掉除數可能為 0 的情況。
如何讓整數之間的運算結果產生小數
你可以在運算時預先乘上 1.0 ,這樣,在進行運算時,數字是以浮點數的方式進行運算,最終結果也自然就是浮點數了。
1 | int a = 5, b = 3; |
結果:
1 | 1.66667 |
控制小數點以下的輸出位數
從上面的例子,我們可以發現,答案只輸出到小數點後第五位。
若要輸出到小數點後第十位,該怎麼做呢?
1 |
|
結果:
1 | 1.6666666667 |
其中,fixed表示的,是小數點以下的意思,因此,若沒有fixed,setprecision(10)代表的,其實是總共輸出十位數字。
fixed與setprecision在iomanip標頭檔中,使用時必須先
1 |
如使用萬用標頭檔bits/stdc++.h則不須理會。
設定一次輸出位數後,下一次便不需要重新設定,例如:
1 | int a = 5, b = 3; |
結果為:
1 | 1.6666666667 |
模運算
若我們要取得 a 除以 b 的餘數,可以這樣寫:
1 | int a, b; |
因 $a,b$ 都是整數,因此 $a/b$ 僅會保留整數部分,根據除法原理,$a / b = c … d$ 可改寫為 $a = b * c + d$,其中 $0 \le d < b$。因此,$c$ 就是 $a/b$ 的整數部分,將 $a$ 減去 $b*c$ 後,就得到餘數 $d$ 了!
其實,在C++裡,有個幫你寫好的餘數功能:
1 | int a, b; |
% 的優先次序與乘除法相同,因此,若要取 a+b 除以 c 的餘數,必須這樣寫:
1 | int a, b, c; |
運算後指派
1 | int a = 5, b = 4, c = 0; |
C++ 中,針對 $a = a + 5$ 之類的操作,有著更簡潔的寫法:
1 | a += 5; // a = a + 5 |
針對 $a = a + 1$ 之類的操作,還有更簡單的寫法:
1 | a++; // a += 1 |
練習
AC Code (強烈建議自行寫完後再看)
1 | // TOJ 93 |
1 | // TOJ 98 |
1 | // TOJ 522 |