时间限制: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;
}