手动排除特殊情况;

对于一般情况,使用位运算和加减法来计算除法,使用sign记录结果符号;(这部分为leetcode 29题的答案)

使用hashmap来记录循环体出现的开始位置(如果有的话),使用flag记录有无循环体出现;

class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if((numerator==INT_MIN||numerator==INT_MAX)&&(denominator==||denominator==-)){
if(numerator==INT_MIN){
return denominator==?"-2147483648":"";
}
if(numerator==INT_MAX){
return denominator==-?"-2147483647":"";
}
}
if(denominator==) return "";
string res;
int sign=numerator^denominator;
if(numerator==) sign=;
long num=labs(numerator),den=labs(denominator),ans=,r=;
for(int i=;i>=;i--){
if((num>>i)>=den){
ans+=<<i;
num-=den<<i;
}
}
r=num; if(ans==) res+="";
while(ans!=){
res+=ans%+'';
ans=ans/;
}
if(sign<) res+="-";
reverse(res.begin(),res.end());
if(r!=)
res+=".";
int rst=,flag=;
unordered_map<int,int>m;
string right;
int i=;
//此处分数不会是无线不循环小数,因此只需要判断是否除尽和是否循环两个break条件就可以了;
while(r!=){
r*=;
if(m.count(r)) {flag=;break;}
m[r]=i;
if(r>den){
rst=r/den;
r=r-rst*den;
right.push_back(''+rst);
}else{
right+="";
}
i++;
}
if(flag==){
res=res+right.substr(,m[r])+"("+right.substr(m[r])+")";
}else{
res+=right;
}
return res;
}
};

最新文章

  1. visual studio installer 打包123
  2. iOS-工厂模式
  3. Extjs ComboBox 动态选中第一项
  4. [LintCode] Paint House II 粉刷房子之二
  5. oracle学习
  6. BW基于ALE的主数据增量机制分析
  7. Xib文件的使用
  8. OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)
  9. Android如何获取系统高度、标题栏和状态栏高度
  10. sprite常用操作
  11. VPN销售管理系统一键安装包
  12. ulimit 参数介绍
  13. ASP.NET使用ImageMap控件
  14. Project 9:两种简单数列排序
  15. Spring Boot 2.x (十二):Swagger2的正确玩儿法
  16. java 反射的简介
  17. oracle中索引的使用
  18. logmnr使用
  19. (二)SSO之CAS框架单点退出,自定义退出界面.
  20. 分享一个强大的makedown编辑器

热门文章

  1. Zookeeper启动失败,报错 can not open chanel to 2
  2. python-迭代器与生成器1
  3. Linux SUID SGID SBIT 简介和权限设定
  4. 使用sproxy.exe访问基于soap的webservice
  5. C#将html table 导出成excel实例
  6. D-query SPOJ - DQUERY (莫队算法裸题)
  7. primer看完了
  8. HDU 多校第四场题解
  9. Centos安装nmap端口查看工具
  10. python广度遍历文件夹