***Leetcode 166. Fraction to Recurring Decimal

https://leetcode.com/problems/fraction-to-recurring-decimal/description/

模拟,想下啥时间会循环

class Solution {
public:
    string fractionToDecimal(int num, int de) {
        if (num == 0) return "0";
        string result;
        if (  (num <0 ) ^ (de < 0) ) {
            result = result + '-';
        }
        
        long long a = abs((long long)num), b = abs((long long)de);
        result = result + to_string(a/b);
        a = a % b;
        
        if (!a) return result;
        result = result + '.';
        map< pair<long long, long long>, int > pos;
        
        while (a) {
        
            cout << "a:" << a ;
            long long  old = a;
            a *= 10;
            long long r = a % b;
            pair<long long, long long> tmp = make_pair(old, r);
            cout << " r:" << r << endl;
            if (pos.find(tmp) != pos.end()) {
                result.insert( pos[tmp], 1, '(' );
                result = result + ')';
                break;
            }
            result = result + to_string( a/b );
            a %= b;
            pos[ tmp ] = result.size() - 1;
        }
        return result;
    }
};

https://blog.csdn.net/u012162613/article/details/41998617 这里的代码更简洁

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if(numerator==0) return "0";
        string result;
        if(numerator<0 ^ denominator<0 ) result+='-';   //异或,numerator<0和denominator<0仅有一个为真
        //转化为正数,INT_MIN转化为正数会溢出,故用long long。long long int n=abs(INT_MIN)得到的n仍然是负的,所以写成下面的形式。
        long long int n=numerator,d=denominator;
        n=abs(n);d=abs(d);              
        
        result+=to_string(n/d);  //整数部分
        long long int r=n%d;    //余数r
        if(r==0) return result;
        else result+='.';
        //下面处理小数部分,用哈希表
        unordered_map<int,int> map;
        while(r){
            //检查余数r是否在哈希表中,是的话则开始循环了
            if(map.find(r)!=map.end()){
                result.insert(map[r],1,'(');   //http://www.cplusplus.com/reference/string/basic_string/insert/
                result+=')';
                break;
            }
            map[r]=result.size();    //这个余数对应于result的哪个位置
            //正常运算
            r*=10;
            result+=to_string(r/d);
            r=r%d;
        }
        return result;
    }
};

有一个case需要测试的  1/6






猜你喜欢

转载自blog.csdn.net/u011026968/article/details/80955167