leetcode 166分数到小数
2024-09-01 16:06:51
手动排除特殊情况;
对于一般情况,使用位运算和加减法来计算除法,使用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;
}
};
最新文章
- visual studio installer 打包123
- iOS-工厂模式
- Extjs ComboBox 动态选中第一项
- [LintCode] Paint House II 粉刷房子之二
- oracle学习
- BW基于ALE的主数据增量机制分析
- Xib文件的使用
- OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)
- Android如何获取系统高度、标题栏和状态栏高度
- sprite常用操作
- VPN销售管理系统一键安装包
- ulimit 参数介绍
- ASP.NET使用ImageMap控件
- Project 9:两种简单数列排序
- Spring Boot 2.x (十二):Swagger2的正确玩儿法
- java 反射的简介
- oracle中索引的使用
- logmnr使用
- (二)SSO之CAS框架单点退出,自定义退出界面.
- 分享一个强大的makedown编辑器