• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ArgenBarbie
博客园    首页    新随笔    联系   管理    订阅  订阅
166. Fraction to Recurring Decimal -- 将除法的商表示成字符串(循环节用括号表示)

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".
string fractionToDecimal(int numerator, int denominator) {

    string result;

    //deal with the `ZERO` cases

    if (denominator == 0){ return result; }

    if (numerator == 0) { return "0"; }



    //using long long type make sure there has no integer overflow

    long long n = numerator;

    long long d = denominator;



    //deal with negtive cases 

    bool sign = ((float)numerator/denominator >= 0);

    if ( n < 0 ){ n = -n; }

    if ( d < 0 ){ d = -d; }

    if (sign == false){

        result.push_back('-');

    }



    long long remainder = n % d;

    long long division = n / d;

    ostringstream oss;

    oss << division;

    result += oss.str();

    if (remainder == 0){

        return result;

    }

    //remainder has value, the result is a float

    result.push_back('.');



    //using a map to record all of reminders and their position.

    //if the reminder appeared before, which means the repeated loop begin, 

    //then, get the place from map to insert "(".

    //(In C++11, it's better to use unordered_map )

    map<long long, int> rec;



    for (int pos=result.size(); remainder!=0; pos++, remainder=(remainder*10)%d ) {

        if (rec.find(remainder) != rec.end()) {

            result.insert(result.begin()+rec[remainder], '(');

            result.push_back(')');

            return result;

        }

        rec[remainder] = pos;

        result.push_back((remainder*10)/d + '0');

    }



    return result;

}

 

posted on 2016-08-24 09:46  ArgenBarbie  阅读(188)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3