两个整数相除的计算

----------------------------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+1) * 除数 > 被除数 那么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);}

 

posted @ 2020-11-15 19:56  哈哈不是嘎嘎  阅读(726)  评论(0编辑  收藏  举报