Fraction to Recurring Decimal(STRING-TYPE CONVERTION)

QUESTION

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)".

1ST TRY

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        char* ch  = new char();
        string ret;
        string fractionStr = "";
        int remain;
        vector<bool> flag(10, false);
        
        //integer part
        *ch = numerator/denominator +'0';
        ret = ch;
        
        //fraction part
        while(1)
        {
            remain = numerator%denominator;
            if(remain == 0) return ret;
            else if(flag[remain]) return ret + ".(" + fractionStr + ")";
            else
            {
                flag[remain] = true;
                *ch = numerator/denominator +'0';
                fractionStr += ch;
            }
        }
    }
};

Result: Runtime Error

Last executed input: -50, 8

2ND TRY

考虑了负数情况

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        string intStr = "";
        string fractionStr = "";
        string tmpStr = "";
        int remain;
        vector<bool> flag(10, false);
        
        // int 转 string
        stringstream ss;
    
        //negative or not
        if(numerator > 0 && denominator < 0)
        {
            intStr = "-";
            denominator = ~(denominator-1);
        }
        else if(numerator < 0 && denominator > 0) 
        {
            intStr = "-";
            numerator = ~(numerator-1);
        }
        else if(numerator < 0 && denominator < 0) 
        {
            numerator = ~(numerator-1);
            denominator = ~(denominator-1);
        }
        
        //integer part
        ss << numerator/denominator;
        ss >> tmpStr;
        intStr += tmpStr;
        remain = numerator%denominator;
        if(remain == 0) return intStr;
        
        //fraction part
        while(1)
        {
            if(remain == 0) return intStr + "." + fractionStr;
            else if(flag[remain]) return intStr + ".(" + fractionStr + ")";
            else
            {
                flag[remain] = true;
                numerator = remain * 10;
                remain = numerator%denominator;
                ss.clear();
                ss << numerator/denominator;
                ss >> tmpStr;
                fractionStr += tmpStr;
            }
        }
    }
};

Result: Runtime Error

Last executed input: -2147483648, -10

3RD TRY

考虑溢出的情况

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long int num = (long long int) numerator;
        long long int den = (long long int) denominator;
        
        string intStr = "";
        string fractionStr = "";
        string tmpStr = "";
        int remain;
        set<int> flag;
        
        // int 转 string
        stringstream ss;
    
        //negative or not
        if(num > 0 && denominator < 0)
        {
            intStr = "-";
            den = ~(den-1);
        }
        else if(num < 0 && den > 0) 
        {
            intStr = "-";
            num = ~(num-1);
        }
        else if(num < 0 && den < 0) 
        {
            num = ~(num-1);
            den = ~(den-1);
        }
        
        //integer part
        ss << num/den;
        ss >> tmpStr;
        intStr += tmpStr;
        remain = num%den;
        if(remain == 0) return intStr;
        
        //fraction part
        while(1)
        {
            if(remain == 0) return intStr + "." + fractionStr;
            else if(flag.find(remain)!=flag.end()) return intStr + ".(" + fractionStr + ")";
            else
            {
                flag.insert(remain);
                num = remain * 10;
                remain = num%den;
                ss.clear();
                ss << num/den;
                ss >> tmpStr;
                fractionStr += tmpStr;
            }
        }
    }
};

Result: Wrong

Input: 1, 6
Output: "0.(16)"
Expected: "0.1(6)"

4TH TRY

循环的位置得准确,所以用map代替set

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long int num = (long long int) numerator;
        long long int den = (long long int) denominator;
        
        string ret = "";
        string tmpStr = "";
        int remain;
        map<int,int> flag;
        
        // int 转 string
        stringstream ss;
    
        //negative or not
        if(num > 0 && denominator < 0)
        {
            ret = "-";
            den = ~(den-1);
        }
        else if(num < 0 && den > 0) 
        {
            ret = "-";
            num = ~(num-1);
        }
        else if(num < 0 && den < 0) 
        {
            num = ~(num-1);
            den = ~(den-1);
        }
        
        //integer part
        ss << num/den;
        ss >> tmpStr;
        ret += tmpStr;
        remain = num%den;
        if(remain == 0) return ret;
        
        //fraction part
        ret += ".";
        while(1)
        {
            if(remain == 0) return ret;
            else if(flag.find(remain)!=flag.end())
            {
                ret.insert(flag[remain], 1, '('); 
                return ret + ")";
            }
            else
            {
                flag[remain] = ret.length();
                num = remain * 10;
                remain = num%den;
                ss.clear();
                ss << num/den;
                ss >> tmpStr;
                ret += tmpStr;
            }
        }
    }
};

Result: Wrong

Input: -1, -2147483648
Output: "0.000000000000000000000000000000-1"
Expected: "0.0000000004656612873077392578125"

5TH TRY

remain也要申请为long long int, 否则在num = remain * 10;会溢出

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long int num = (long long int) numerator;
        long long int den = (long long int) denominator;
        
        string ret = "";
        string tmpStr = "";
        long long int remain;
        map<int,int> flag;
        
        // int 转 string
        stringstream ss;
    
        //negative or not
        if(num > 0 && denominator < 0)
        {
            ret = "-";
            den = ~(den-1);
        }
        else if(num < 0 && den > 0) 
        {
            ret = "-";
            num = ~(num-1);
        }
        else if(num < 0 && den < 0) 
        {
            num = ~(num-1);
            den = ~(den-1);
        }
        
        //integer part
        ss << num/den;
        ss >> tmpStr;
        ret += tmpStr;
        remain = num%den;
        if(remain == 0) return ret;
        
        //fraction part
        ret += ".";
        while(1)
        {
            if(remain == 0) return ret;
            else if(flag.find(remain)!=flag.end())
            {
                ret.insert(flag[remain], 1, '('); 
                return ret + ")";
            }
            else
            {
                flag[remain] = ret.length();
                num = remain * 10;
                remain = num%den;
                ss.clear();
                ss << num/den;
                ss >> tmpStr;
                ret += tmpStr;
            }
        }
    }
};

Result: Accepted

 

posted on 2014-12-19 19:37  joannae  阅读(274)  评论(0编辑  收藏  举报

导航