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;
}

 

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