• 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;
        }
    };
  • 相关阅读:
    Leetcode 35. 搜索插入位置 二分查找
    《算法竞赛进阶指南》 第一章 Acwing 91. 最短Hamilton路径
    《算法竞赛进阶指南》 第一章 Acwing 90. 64位整数乘法
    《算法竞赛进阶指南》 第一章 Acwing 89. a^b 位运算 更新bitset版本
    挑战程序设计竞赛 2章习题 Aizu
    挑战程序设计竞赛 2章习题 poj 2718 Smallest Difference dfs
    Leetcode 33. 搜索旋转排序数组 二分
    Leetcode 30. 串联所有单词的子串
    LeetCode 22. 括号生成 DFS
    Leetcode 16. 最接近的三数之和 及后继几题
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9634789.html
Copyright © 2020-2023  润新知