時間限制: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;
}