a/b---2019快手笔试题

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:2327

本题知识点: Java工程师 C++工程师 安卓工程师 iOS工程师 运维工程师 前端工程师 算法工程师 PHP工程师 测试工程师 快手 模拟 数学

 算法知识视频讲解

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

题目描述

求a/b的小数表现形式。如果a可以整除b则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。

 

输入描述:

两个整数a和b,其中

0 <= a <= 1000 000

1 <= b <= 10 000

输出描述:

一个字符串,该分数的小数表现形式

示例1

输入

复制

10 1

输出

复制

10

说明

10/1 = 10

示例2

输入

复制

1 2

输出

复制

0.5

说明

1/2 = 0.5

示例3

输入

复制

1 3

输出

复制

0.(3)

说明

1/3 = 0.333333...

示例4

输入

复制

1 6

输出

复制

0.1(6)

说明

1/6 = 0.16666666....

示例5

输入

复制

1 7

输出

复制

0.(142857)

说明

1 / 7 = 0.1428571428...

解题思路:

该题的难点就是区分循环小数和有限小数,然后再找出循环小数的循环节,我的思路是先求出num=m%n,如果num==0,则说明整除,如果不等于0就进入一个while循环,进行如下操作:

while(num!=0)
{
   //省略
   num=(num*10)%n;
   //省略
}

当map.find(num)!=map.end()说明该结果为循环小数,并且在该处出现循环节

代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;
int main()
{
    while(cin>>m>>n)
    {
        int num=m/n;
        int num1=m%n;
        cout<<num;
        if(num1==0)
        {
            cout<<endl;
            continue;
        }
        cout<<".";
        map<int,int>mp;
        vector<int>v;
        int j=0;
        while(num1!=0)
        {
            if(mp.find(num1)==mp.end())
            {
                v.push_back((num1*10)/n);
                mp[num1]=j;
                num1=(num1*10)%n;
                j++;
            }
            else
            {
                int vis=mp[num1];
                for(int i=0; i<vis; i++)cout<<v[i];
                cout<<"(";
                for(int i=vis; i<j; i++)cout<<v[i];
                cout<<")"<<endl;
                return 0;
            }
        }
        for(int i=0; i<j; i++)
            cout<<v[i];
        cout<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章