《算法竞赛入门经典》习题2-5
习题2-5 分数化小数(decimal)
输入正整数 a, b, c,输出 a/b 的小数形式,精确到小数点后c位。\(a, b ≤ 10^6, c ≤ 100\)。输入包含多组数据,结束标记为 a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
C语言实现
#include <stdio.h>
#include <math.h>
int main()
{
FILE *fin, *fout;
fin = fopen("ee02-05.c.in", "rb");//需要在源文件同级文件夹下创建此文件并填入数据
fout = fopen("ee02-05.c.out", "wb");
int a, b, c, tmp, count = 0;
double integer_part, decimal_part;
fscanf(fin, "%d%d%d", &a, &b, &c);
while (a!=0 || b!=0 || c!=0)
{
if (b==0 && (a!=0 || c!=0))
{//此时被除数为0
fprintf(fout, "Case %d: +∞\n", ++count);
}
else
{
decimal_part = modf(1.0*a/b, &integer_part);
decimal_part *= pow(10, c);
if (decimal_part>=-1e-15 && decimal_part<=1e-15)
{//如果小数部分为0则需要使用循环输入足够位数的0
fprintf(fout, "Case %d: %.0f.", ++count, integer_part);
tmp = c + 1;
while (--tmp > 0)
{
fprintf(fout, "0");
}
fprintf(fout, "\n");
}
else
{
fprintf(fout, "Case %d: %.0f.%.0f\n", ++count, integer_part, decimal_part);
}
}
fscanf(fin, "%d%d%d", &a, &b, &c);
}
fclose(fin);
fclose(fout);
return 0;
}
输入:
输出:
使用C++实现,可以使用iomanip中的setpercision来设置精度
C++实现
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
ifstream fin;
ofstream fout;
fin.open("ee02-05.cpp.in", ios::in);
fout.open("ee02-05.cpp.out", ios::out);
int a, b, c, count = 0;
double result;
fin >> a >> b >> c;
while (a!=0 || b!=0 || c!=0)
{
if (a!=0 && b==0)
{
fout << "Case " << (++count) << ": +∞" << endl;
}
else
{
result = 1.0*a/b;
fout << "Case " << (++count) << ": " << fixed << setprecision(c) << result << endl;
fin >> a >> b >> c;
}
}
fin.close();
fout.close();
return 0;
}
输入:
输出: