zoukankan      html  css  js  c++  java
  • 两个整数相除的计算

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

  • 相关阅读:
    分享
    慕课网-软件测试基础-学习笔记
    向量内积(点乘)和外积(叉乘)概念及几何意义
    使用opencv3+python实现视频运动目标检测
    解决opencv3运行opencv2代码时报错的修改备忘录
    分享
    OpenCV学习笔记
    LeetCode
    LeetCode
    npm安装包很慢
  • 原文地址:https://www.cnblogs.com/silentNight/p/13978613.html
Copyright © 2011-2022 走看看