题目
描述:
实现接口:
/---------------------------------------------------------------------------------
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;
}