且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[华为机试练习题]53.整数相除(AC 但还有bug)

更新时间:2022-08-12 18:48:23

题目

描述:
实现接口:

/---------------------------------------------------------------------------------
 Description  : 整数相除。
 Input        : unsigned int dividend :被除数,取值为无符号整数。
                unsigned int divisor: 除数,取值为无符号整数。
 Output       : Char *pResult       : 运算结果。
 Return Value : 0:成功; -1:失败;
---------------------------------------------------------------------------------/
int IntegerDivision (unsigned int dividend,  
                           unsigned int divisor,
                           Char *pResult); 
说明:
Char *pResult的空间由调用者提供,结果中最多保存十位整数,五位小数,整数部分超出十位,返回失败;小数部分超出五位,四舍五入;
存储结果以字符串形式显示,整数和小数部分需加上小数点。如结果为2.05,则输出的结果为”2.05”。

练习阶段:

中级 

代码

/*---------------------------------------
*   日期:2015-07-04
*   作者:SJF0115
*   题目:整数相除 
*   来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include "oj.h"
#include <vector>
using namespace std;

// 提取各位上数
vector<int> NumSplit(int num){
    vector<int> result;
    if(num == 0){
        result.push_back(0);
        return result;
    }//if
    while(num){
        result.insert(result.begin(),num % 10);
        num /= 10;
    }//while
    return result;
}
/***********************************************************************
 Description  : 整数相除。
 Input        : unsigned int dividend :被除数,取值为无符号整数。
                unsigned int divisor: 除数,取值为无符号整数。
 Output       : Char *pResult       : 运算结果。
 Return Value : 0:成功; -1:失败;
***********************************************************************/
int IntegerDivision (unsigned int dividend, unsigned int divisor,char *pResult){
    if(pResult == NULL){
        return -1;
    }//if
    // 除数不能为0
    if(divisor == 0){
        return -1;
    }//if
    // 整数部分
    int result = dividend / divisor;
    vector<int> integerVec = NumSplit(result);
    // 整数部分超出十位,返回失败
    int intergerSize = integerVec.size();
    if(intergerSize > 10){
        return -1;
    }//if
    int index = 0;
    for(int i = 0;i < intergerSize;++i){
        pResult[index++] =  integerVec[i] + '0';
    }//for

    // 小数部分 乘以1000000 截取小数前6位
    int result2 = dividend % divisor * 1000000 / divisor;
    // 无小数
    if(result2 == 0){
        pResult[index] = '\0';
        return 0;
    }//if
    vector<int> pointVec = NumSplit(result2);
    int pointSize = pointVec.size();
    // 四舍五入
    if(pointSize > 5){
        if(pointVec[5] >= 5){
            ++pointVec[4];
        }//if
        // 去掉小数第6位 只保留5位
        pointVec.pop_back();
        --pointSize;
    }//if

    pResult[index++] = '.';
    for(int i = 0;i < pointSize;++i){
        pResult[index++] =  pointVec[i] + '0';
    }//for

    // 删除后导0  9/8 = 1.12500
    for(int i = index-1;i >= 0;--i){
        if(pResult[i] != '0'){
            index = i+1;
            break;
        }//if
    }//for
    pResult[index] = '\0';
    //cout<<"整数->"<<result<<"    小数->"<<result2<<endl;
    return 0;
}