早教吧 育儿知识 作业答案 考试题库 百科 知识分享

c++1、分数化小数(fracdec.cpp/1S/128M)1、分数化小数(fracdec.cpp/1S/128M)题目描述写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,

题目详情
c++1、分数化小数(fracdec.cpp/1S/128M)
1、分数化小数(fracdec.cpp/1S/128M)

【题目描述】
写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一个对括号中,例如:
1/3=0.33333333写成0.(3)
41/333=0.123123123写成0.(123)
用xxx.0表示整数
典型的转化例子:
1/3=0.(3)
22/5=4.4
22/5=4.4
2/2=1.0
3/8=0.375
45/46=0.803(571428)

【输入格式】
单独的一行包括被空格分开的N和D,1<=N,D<=100000。

【输出格式】
输出一行小数的表示方法上面已经说得很明白了。

【样例输入】
45 56

【样例输出】
0.803(571428)
▼优质解答
答案和解析
修改了下楼上的代码:
#include
#include
#include
#include
typedef std::vector frac_t;
struct result_t
{
int int_, pos;// 整数部分,循环节的位置
frac_t frac;// 小数部分
};
result_t do_main(int a, int b)
{
if (b < 0)
{
a = -a;
b = -b;
}
result_t res;
// 求整数部分
res.int_ = a / b;
// 求分数部分
std::map rest;// 余数和在小数点后的位数,若余数出现重复,说明有循环节
int pos = 0;
do // 最多循环b次
{
a %= b;
if (a == 0 || rest.find(a) != rest.end()) break;
rest.insert(std::make_pair(a, pos++));
a *= 10;
res.frac.push_back(a / b);
}
while (true);
if (a) // 余数不为0,有循环节,记下循环节开始的位置
{
res.pos = rest.find(a)->second;
}
else
{
res.pos = res.frac.size();
}
return res;
}
int main()
{
int a, b;
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
while(std::cin >> a >> b)
{
result_t res = do_main(a, b);
std::cout << res.int_ << ".";
if (res.frac.empty())
{
std::cout << "0";
}
else
{
size_t i = 0;
for (; i != res.pos; ++i)
{
std::cout << res.frac[i];
}
// 循环节
if (i != res.frac.size())
{
std::cout << "(";
for (; i != res.frac.size(); ++i)
{
std::cout << res.frac[i];
}
std::cout << ")";
}
}
std::cout << "\n";
}
return 0;
}