《算法竞赛入门经典》习题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;
}

输入:

输出:

posted @ 2022-02-18 23:56  华王135608  阅读(68)  评论(0)    收藏  举报