FLYING

/* TODO: 気の利いた説明を書く */

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

#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は循環する桁数。