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

本文详细介绍了如何实现整数相除的算法,包括整数和小数部分的处理,以及如何将结果以字符串形式输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

描述:
实现接口:

/---------------------------------------------------------------------------------
 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值