----------------------------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);}