分数
题目内容:
写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。
本题中,0≤N≤65535,0<D≤65535,设运算结果小数点后最多保留100位。
输入描述
分别输入N D
输出描述
如果它的小数形式存在循环,则要将其循环节用括号括起来。例如:
1/3= 0.(3)
输入样例
1 7
输出样例
0.(142857)
用代码模拟普通除法,用map保存余数, 当出现相同余数时可以判定出现循环
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<cstdio>
#include<stack>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
map<int, int> mp;
int num[110];
int a, b;
int main()
{
ios::sync_with_stdio(false);
cin >> a >> b;
int p = 0;
int m = a / b;
a = a % b * 10;
bool flag = false;
while (p != 100)
{
while (a < b)
{
a *= 10;
num[++p] = 0;
if (p == 100)
break;
}
num[++p] = a / b;
a = a % b * 10;
if (!a)
{
p++; //p加一的原因为兼容后面的输出< p
break;
}
if (mp[a])
{
flag = true;
break;
}
mp[a] = p;
}
cout << m << '.';
if (flag)
cout << '(';
for (int i = 1; i < p; i++)
cout << num[i];
if (flag)
cout << ')';
}