网易实习第一题:C++实现9进制加法
考试时候通过率为25%,这是考完试又重新写的,应该通过率为百分百了
注意点:要考虑全面,有可能是两个浮点数相加,也有可能是两个整数相加,还有可能是一个整数一个浮点数相加
基本思想 是分治法:用子函数实现,得到每个数的整数部分和浮点数部分,然后为短的部分补零
#include<iostream>
#include<vector>
#include <string>
#include <stdlib.h>
//#include <string.h>
#include<stack>
#include<queue>
#include<set>
#include <algorithm>
# include <functional>
#include<array>
using namespace std;
class Solution
{
public:
//网易实习第一题:C++实现9进制加法
//考试时候通过率为25%,这是考完试又重新写的,应该通过率为百分百了
//要考虑全面,有可能是两个浮点数相加,也有可能是两个整数相加,还有可能是一个整数一个浮点数相加
//基本思想是分治法:用子函数实现,得到每个数的整数部分和浮点数部分,然后为短的部分补零
bool is_float(string num) //判断是否是浮点数
{
bool flag=false;
if(!num.empty())
{
for(int i=0;i<num.size();i++)
{
if(num[i]=='.')
{
flag=true;
}
}
}
return flag;
}
stack<int> get_float(string num)//得到小数部位
{
int k;
stack<int> res;
for(k=0;k<num.size();k++)
{
if(num[k]=='.')
{
break;
}
}
for(int j=k+1;j<num.size();j++)
{
res.push(num[j]-'0');
}
return res;
}
stack<int> get_int(string num)//得到整数部位
{
stack<int> res;
for(int i=0;i<num.size();i++)
{
if(num[i]!='.')
{
res.push(num[i]-'0');
}
else
{
break;
}
}
return res;
}
void length_same(stack<int> &s1,stack<int> &s2)//为俩小数位 位数比较短的 补零
{
if(s1.size()>s2.size())
{
for(int i=s2.size();i<s1.size();i++)
{
s2.push(0);
}
}
else
{
for(int i=s1.size();i<s2.size();i++)
{
s1.push(0);
}
}
}
string add(string num1,string num2)
{
stack<int> int1;
stack<int> int2;
stack<int> float1;
stack<int> float2;
int flag = 0;//是否进位的标志位
int flag_dot=0;//是否有小数参与运算的标志位
string res;//返回的结果
int1 = get_int(num1);
int2 = get_int(num2);
bool flag1_float;
bool flag2_float;
flag1_float = is_float(num1);
flag2_float = is_float(num2);
if(flag1_float)
{
float1 = get_float(num1);
}
if(flag2_float)
{
float2 = get_float(num2);
}
//length_same(float1,float2);
if(!float1.empty()||!float2.empty())
{
length_same(float1,float2);
}
while(!float1.empty()&&!float2.empty())
{
flag_dot = 1;
int a = float1.top();
float1.pop();
int b = float2.top();
float2.pop();
int temp = a+b+flag;
if(temp<9)
{
res = res+to_string(temp);
flag = 0;
}
else
{
temp = a+b+flag-9;
res = res+to_string(temp);
flag = 1;
}
}
if(flag_dot==1)
{
res = res+'.';
}
while(!int1.empty()&&!int2.empty())
{
int a = int1.top();
int1.pop();
int b = int2.top();
int2.pop();
int temp = a+b+flag;
if(temp<9)
{
res = res+to_string(temp);
flag = 0;
}
else
{
temp = a+b+flag-9;
res = res+to_string(temp);
flag = 1;
}
}
while(!int1.empty())
{
int a = int1.top();
int1.pop();
int temp = a+flag;
if(temp<9)
{
res = res+to_string(temp);
flag = 0;
}
else
{
temp = a+flag-9;
res = res+to_string(temp);
flag = 1;
}
}
while(!int2.empty())
{
int a = int2.top();
int2.pop();
int temp = a+flag;
if(temp<9)
{
res = res+to_string(temp);
flag = 0;
}
else
{
temp = a+flag-9;
res = res+to_string(temp);
flag = 1;
}
}
if(flag==1)
{
res = res+to_string(1);
}
reverse(res.begin(),res.end());
return res;
}
};
int main()
{
Solution s;
string result;
result = s.add("1.1","15.86");
cout<<result<<endl;
return 0;
}
测试用例:1.1+15.86
测试结果:

京公网安备 11010502036488号