Fork me on GitHub

2018校招关于循环小数的题目

1. 拼多多笔试题 循环小数的开始位置和循环节

3-1.png

3-2.png

3-3.png

解析:

模拟长除法的计算过程。

①mod = a%b;

②小数 = (mod*10) / b;

③mod = (mod*10)%b;

循环②③步,当出现重复的余数的时候,也就是循环节出现了

- 也可以使用一个map<int,int> 组成(余数,余数的第几位),方便查找!

- 此题不需要记录余数是什么。

#include<iostream>
#include<vector>
using namespace std;


int main()
{
    vector<int>a;
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        a.clear();
        int t = n%m;
        a.push_back(t);
        bool ok = false;
        while(t)
        {
            t = t * 10 % m;
            for(int i = 0; i < a.size(); i++)
            {
                if(a[i] == t)
                {
                    ok = true;
                    cout<<i<<' '<<a.size()-i<<endl;
                    break;
                }
            }
            if(ok)  break;
            a.push_back(t);
        }
        if(t == 0&&!ok) cout<<a.size()-1<<' '<<0<<endl;
    }
    return 0;
}

2. 快手笔试

  • 编程实现表示循环小数,例如将1/3表示为0.(3)就是将循环节放在括号中

  • 思路和上一题类似,注意一些边界条件
  • 发现这是一道leetcode原题,艹,当时都没有发现;
"""第一题"""

tmp = input().split()
numerator = int(tmp[0])
denominator = int(tmp[1])

def fractionToDecimal(numerator, denominator):
    if numerator == 0:
        return '0'
    res = ''
    if numerator * denominator < 0:
        res += '-'
    numerator, denominator = abs(numerator), abs(denominator)
    res += str(numerator // denominator)
    if numerator % denominator == 0:
        return res
    res += '.'
    r = numerator % denominator
    m = {}
    # print(res)
    while r:
        if r in m:
            res = res[:m[r]] + '(' + res[m[r]:] + ')'
            break
        m[r] = len(res)
        r *= 10
        res += str(r // denominator)
        r %= denominator

    return res


res = fractionToDecimal(numerator, denominator)
# print(res)
if '(' not in res:
    if '.' not in res:
        print(int(res))
    else:
        print(res)
else:
    print(res)
  • https://github.com/apachecn/awesome-leetcode/blob/master/src/kuaishou.md
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;
    }
};
posted @ 2018-09-12 14:58  ranjiewen  阅读(594)  评论(0编辑  收藏  举报