网易实习笔试题(2020.04.11)-9进制的加法
网易实习第一题: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
测试结果: