1. 程式人生 > 實用技巧 >兩個整數相除的計算

兩個整數相除的計算

----------------------------1. 整數相除轉成整數減法的程式

-----------------------------2. 二分查詢法解整數相除

===========================================方式1=====================================

void showResult(const vector<char>& result)
{
    for(int i = 0; i < result.size(); i++)
    {
        if(result[i] != '
.') { cout << (int)result[i]; } else { cout <<"."; } } cout << endl; } void divResult(int dividend, int divisor, vector<char>& result) //dividend/divisor { //忽略了被除數 < 除數的情況 比如 2/3的場景 if (dividend < divisor) {
return; } //忽略被除數或者除數是1的情況 /*除法轉成減法做。 5/3--->3*1 < 5並且3*2 > 5,所以商第一位是1,餘數是2. 2小於3,所以要借位,用20/3進一步算。因為這裡借位了,所以有個小數點在此次計算結果的前面*/ int currentDividend = dividend; //當前的被除數 int curResult = 1; //當前的被除數/除數得出的整數商 while(1) //curResult * 除數 < 被除數 && curResult * 除數 > 被除數 那麼curResult 即為商
{ if( (divisor*curResult <= dividend) && (divisor*(curResult+1) > dividend) { break; } ++curResult; } result.push_back(curResult); if (result.size() == 17) //商的位數,(不含小數是17位, 含小數是16位). 有這麼多位後就不再計算了 { return; } currentDividend -= divisor * curResult; //新的被除數 if (currentDividend == 0) //整除情況 { return; } if (currentDividend < dividend) //有借位的情況 { if(std::find(result.begin(), result.end(), '.') == result.end()) //如果已經放置了小數點,那麼就可以直接借位了,如果是第一次出現借位,那麼需要往結果中加入小數點符號 { result.push_back('.'); } currentDividend *= 10; } divResult(currentDividend, divisor, result); //遞迴計算新的被除數/除數的結果,並把商記錄在result中 } int main() { vector<char> result; divResult(217,3, result); showResult(result); }

void showResult(const vector<char>& result){ for(int i = 0; i < result.size(); i++) { if(result[i] != '.') { cout << (int)result[i]; } else { cout <<"."; } } cout << endl;}

void divResult(int dividend, int divisor, vector<char>& result) //dividend/divisor{ //忽略了被除數 < 除數的情況 比如 2/3的場景 if (dividend < divisor) { return; } //忽略被除數或者除數是1的情況
/*除法轉成減法做。 5/3--->3*1 < 5並且3*2 > 5,所以商第一位是1,餘數是2. 2小於3,所以要借位,用20/3進一步算。因為這裡借位了,所以有個小數點在此次計算結果的前面*/ int currentDividend = dividend; //當前的被除數 int curResult = 1; //當前的被除數/除數得出的整數商
while(1) //curResult * 除數 < 被除數 && curResult * 除數 > 被除數 那麼curResult 即為商 { if( (divisor*curResult <= dividend) && (divisor*(curResult+1) > dividend) { break; }
++curResult; }
result.push_back(curResult);
if (result.size() == 17) //商的位數,(不含小數是17位, 含小數是16位). 有這麼多位後就不再計算了 { return; }
currentDividend -= divisor * curResult; //新的被除數
if (currentDividend == 0) //整除情況 { return; }
if (currentDividend < dividend) //有借位的情況 { if(std::find(result.begin(), result.end(), '.') == result.end()) //如果已經放置了小數點,那麼就可以直接借位了,如果是第一次出現借位,那麼需要往結果中加入小數點符號 { result.push_back('.'); }
currentDividend *= 10; }

divResult(currentDividend, divisor, result); //遞迴計算新的被除數/除數的結果,並把商記錄在result中}



int main(){ vector<char> result; divResult(217,3, result); showResult(result);}