leetcode-166. 分数到小数
题目:
代码:
#include <iostream>
#include <cmath>
#include <string>
#include <map>
#include <cstdlib>
using namespace std;
//小数部分如果余数重复出现两次就表示该小数是循环小数
string fractionToDecimal(int numerator, int denominator) {
if(denominator==0) return ""; //被除数为0的情况
if(numerator==0) return "0"; //除数为0的情况
string str="";
long long num=(long long)numerator; //转为long long防止溢出
long long den=(long long)denominator;
if((num>0)^(den>0)) str.push_back('-'); //一正一负的情况下要加-号
num=llabs(num); //将除数与被除数都转化为正数
den=llabs(den);
str+=to_string(num/den);//处理整数部分
num=num%den; //处理小数部分
if(num==0) return str; //余数为0,表示整除
str.push_back('.'); //余数不为0,添加小数点
int index=str.size()-1; //记录下小数点下标的位置
unordered_map<int,int> record; //map用来记录出现重复数的下标,以便插入(
while(num && record.count(num)==0){
record[num]=++index;
num*=10;
str+=to_string(num/den);
num%=den;
}
if(record.count(num)==1){
str.insert(record[num],"(");
str.push_back(')');
}
return str;
}
int main(){
string str;
int numerator,denominator;
cin>>numerator>>denominator;
str=fractionToDecimal(numerator,denominator);
cout<<str;
return 0;
}