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

