列表

详情


NC351. 分数到小数

描述

给定两个整数 n 和 m,分别表示分数的分子和分母,请你计算其小数的表示形式并以字符串形式返回。

如果返回结果中包含循环小数,则将循环节包含在括号中。
如果存在循环小数,请输出最小的循环节。

数据范围:两个整数都满足

示例1

输入:

1,3

输出:

"0.(3)"

示例2

输入:

5,4

输出:

"1.25"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 10ms, 内存消耗: 1932KB, 提交时间: 2022-05-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m int整型 
     * @return string字符串
     */
    string frac2Dec(int n, int m) {
        // write code her
        unordered_map<long long, int> mp;
        string result;
        if((m<0&&n>0)||(m>0&&n<0)){
            result+="-";
        }
        if(m<0) m=-m;
        if(n<0) n=-n;
        int t1=n/m;
        result+=to_string(t1);
        long long t2=n%m;
        if(t2==0) return result;
        result+=".";
        vector<int> res;
        while(t2&&mp.find(t2)==mp.end()){
            mp[t2]=res.size();
            t2=t2*10;
            res.push_back(t2/m);
            t2=t2%m;
        }
        if(t2!=0){
            int t=mp[t2];
            for(int i=0;i<t;i++)
                result+=to_string(res[i]);
            result+="(";
             for(int i=t;i<res.size();i++)
                result+=to_string(res[i]);
            result+=")";
        }else{
             for(int i=0;i<res.size();i++)
                result+=to_string(res[i]);
        }
        return result;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 1792KB, 提交时间: 2022-05-21

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m int整型 
     * @return string字符串
     */
    string frac2Dec(int n, int m) {
        using LL = long long;
        unordered_map<LL, int> mp;
        int g = __gcd(n, m);
        n /= g;
        m /= g;
        string minor = "";
        if ((n < 0) ^ (m < 0)) {
            minor = "-";
            n = abs(n);
            m = abs(m);
        }
        LL a = n / m, b = n % m;
        if (!b) {
            return minor + to_string(a);
        }
        string bb = "";
        while (true) {
            if (mp.count(b)) {
                bb.insert(bb.begin() + mp[b], '(');
                bb += ')';
                return minor + to_string(a) + "." + bb;
            }
            mp[b] = bb.size();
            b *= 10;
            bb += to_string(b / m);
            b %= m;
            if (b == 0) {
                return minor + to_string(a) + '.' + bb;
            }
        }
        return "";
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 1812KB, 提交时间: 2022-03-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m int整型 
     * @return string字符串
     */
    string frac2Dec(int n, int m) {
        // write code here
        long long nLong = n,mLong = m;
        if(nLong%mLong==0) return to_string(nLong / mLong);
        
        string res;
        if(nLong<0^mLong<0) res.push_back('-');
        nLong = abs(nLong);
        mLong = abs(mLong);
        //整数部分
        res+=to_string(nLong / mLong);
        res+='.';
        
        //小数部分
        long long remain = nLong % mLong;//余数
        string temp;
        unordered_map<long long,int> t;
        int index = 0;//小数的第i位
        while(remain!=0&&!t.count(remain))
        {
            t[remain] = index;
            remain*=10;
            temp+=to_string(remain / mLong);
            remain %= mLong;
            ++index;
        }
        //无限循环小数
        if(remain!=0)
        {
            int FirstIndex = t[remain];
            temp = temp.substr(0,FirstIndex) + '(' + temp.substr(FirstIndex) + ')';
        }
        res+=temp;
        return res;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 1836KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m int整型 
     * @return string字符串
     */
    string frac2Dec(int n, int m) {
        // write code here
        unordered_map<long long,int> mp;
        string result;
        if((m<0&&n>0)||(m>0&&n<0))
        {
            result+="-";
        }
        if(m<0)
            m=-m;
        if(n<0)
            n=-n;
        int t1=n/m;
        result+=to_string(t1);
        long long t2=n%m;
        if(t2==0)
            return  result;
        result+=".";
        vector<int> res;
        while(t2&&mp.find(t2)==mp.end())
        {
            mp[t2]=res.size();
            t2=t2*10;
            res.push_back(t2/m);
            t2=t2%m;
        }
        if(t2!=0)
        {
            int t=mp[t2];
            for(int i=0;i<t;i++)
                result+=to_string(res[i]);
            result+="(";
            for(int i=t;i<res.size();i++)
                result+=to_string(res[i]);
            result+=")";
        }else{
            for(int i=0;i<res.size();i++)
                result+=to_string(res[i]);
        }
        return result;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 1844KB, 提交时间: 2022-07-02

class Solution {
  public:
    string frac2Dec(int n, int m) {
        unordered_map<long long, int> mp;
        string z;
        if ((m < 0 && n > 0) || (m > 0 && n < 0)) {
            z += "-";
        }
        if (m < 0) m = -m;
        if (n < 0) n = -n;
        int x = n / m;
        z += to_string(x);
        long long y = n % m;
        if (y == 0) return z;
        z += ".";
        vector<int> v;
        while (y && mp.find(y) == mp.end()) {
            mp[y] = v.size();
            y = y * 10;
            v.push_back(y / m);
            y = y % m;
        }

        if (y != 0) {
            int t = mp[y];
            for (int i = 0; i < t; i++)
                z += to_string(v[i]);
            z += "(";
            for (int i = t; i < v.size(); i++)
                z += to_string(v[i]);
            z += ")";
        } else {
            for (int i = 0; i < v.size(); i++)
                z += to_string(v[i]);
        }
        return z;
    }
};

上一题