C++取余符號%的實現(xiàn)示例
前言
c++的%是取余運算符是嗎,如果做取余運算正數(shù)負數(shù)都可以直接使用,如果是取模運算負數(shù)時就要自己調(diào)整一下是吧
一、核心結(jié)論:C++的%是取余運算符(而非數(shù)學(xué)上的模運算符)
C++中的%運算符實現(xiàn)的是取余運算(商向零取整),而非數(shù)學(xué)意義上的模運算(商向負無窮取整)。這一點是理解后續(xù)問題的關(guān)鍵。
二、關(guān)于“正數(shù)/負數(shù)能否直接使用%”的說明
1. 正數(shù)場景:直接用,無任何問題
當(dāng)被除數(shù)a和除數(shù)b均為正整數(shù)時,取余和模運算的結(jié)果完全一致,%運算符的結(jié)果就是你想要的(無論是取余還是模運算)。
示例:
#include <iostream>
using namespace std;
int main() {
cout << 7 % 3; // 輸出1(取余/模運算結(jié)果一致)
cout << 9 % 6; // 輸出3(取余/模運算結(jié)果一致)
return 0;
}
2. 負數(shù)場景:語法上可以直接用,但結(jié)果是取余(符號與被除數(shù)一致)
C++11及以后的標(biāo)準(zhǔn)明確規(guī)定:a % b的結(jié)果滿足**(a / b) * b + (a % b) = a,其中a / b是向零取整**(截斷小數(shù)部分)。因此,%的結(jié)果符號與**被除數(shù)a**一致。
示例:
#include <iostream>
using namespace std;
int main() {
cout << -7 % 3; // 輸出-1(被除數(shù)-7為負,結(jié)果為負)
cout << 7 % -3; // 輸出1(被除數(shù)7為正,結(jié)果為正)
cout << -7 % -3; // 輸出-1(被除數(shù)-7為負,結(jié)果為負)
return 0;
}
這里的關(guān)鍵是:負數(shù)場景下%的結(jié)果是取余,而非模運算。如果你的業(yè)務(wù)邏輯需要的是數(shù)學(xué)上的模運算(結(jié)果與除數(shù)同符號),直接用%會得到不符合預(yù)期的結(jié)果(比如-7 % 3得到-1,但模運算需要的是2)。
三、如果需要在C++中實現(xiàn)數(shù)學(xué)上的模運算(負數(shù)需手動調(diào)整)
若要得到模運算的結(jié)果(結(jié)果與除數(shù)同符號,商向負無窮取整),需要對%的結(jié)果進行手動調(diào)整。核心思路是:將取余結(jié)果加上除數(shù)的絕對值,再取一次余,確保結(jié)果落在[0, |b|)范圍內(nèi)。
1. 通用調(diào)整公式
模運算結(jié)果 = (a % b + b) % b
這個公式對正數(shù)、負數(shù)、除數(shù)正負都適用,能穩(wěn)定得到數(shù)學(xué)上的模運算結(jié)果。
2. 代碼實現(xiàn)(封裝成模運算函數(shù))
#include <iostream>
using namespace std;
// 實現(xiàn)數(shù)學(xué)上的模運算(結(jié)果與除數(shù)同符號)
int mod(int a, int b) {
if (b == 0) {
// 除數(shù)不能為0,可根據(jù)需求拋異常或終止程序
cerr << "除數(shù)不能為0" << endl;
exit(1);
}
return (a % b + b) % b;
}
int main() {
cout << mod(-7, 3); // 輸出2(模運算:與除數(shù)3同符號)
cout << mod(7, -3); // 輸出-2(模運算:與除數(shù)-3同符號)
cout << mod(7, 3); // 輸出1(正數(shù)場景與取余一致)
cout << mod(-7, -3); // 輸出-1(模運算:與除數(shù)-3同符號)
return 0;
}
四、補充注意事項
- 除數(shù)不能為0:無論是%取余還是手動實現(xiàn)的模運算,除數(shù)b都不能為0,否則會觸發(fā)未定義行為(程序崩潰或異常)。
- 浮點數(shù)不支持%:C++的%運算符僅適用于整數(shù)類型(int、long等),如果要對浮點數(shù)做類似運算,需使用<cmath>頭文件中的fmod()函數(shù)(但浮點數(shù)的模運算邏輯與整數(shù)不同)。
總結(jié)
- C++的%是取余運算符(商向零取整),正數(shù)場景可直接用,負數(shù)場景語法上也能直接用,但結(jié)果是取余(符號與被除數(shù)一致);
- 若需要數(shù)學(xué)上的模運算(結(jié)果與除數(shù)同符號),負數(shù)場景下需用(a % b + b) % b手動調(diào)整結(jié)果;
- 無論取余還是模運算,都要保證除數(shù)不為0。
到此這篇關(guān)于C++取余符號%的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++取余符號%內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn)
本文主要介紹了C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09

