FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

循環小数を分数に変換するよ!

#define round(x) ((x >= 0) ? (int)(x + 0.5) : (int)(x - 0.5))
#define absolute(x) ((x >= 0) ? x : -x)
#define LIMIT 1.0E-6

// 循環小数を分数に変換
void double_to_frac(double n, int m)
{
	int a, b, xa = 1, xb = 1, p = 1;
	
	// p = 10^m
	while (m--) p *= 10;
	
	// nを分数に変換
	while (absolute(n - round(n)) > LIMIT) {
		n *= 10;
		xa *= 10;
	}
	
	// 非循環部と循環部に切り分けて処理
	a = round(n) / p;
	xa /= p;
	b = round(n) - a * p;
	if (p != 1) xb = (p-1) * xa;
	
	// とりあえず画面表示だけ
	printf("%d/%d\n", a*xb + b*xa, xa*xb);
}

引数の double n は変換する浮動小数点数で、int mは循環する桁数。