1140 Expanding Fractions

問題概要

正整数n,mが与えられる。n/mが割り切れるならそれを、そうでないなら最初の循環節の終わりまで小数を出力し、循環節の長さを出力せよ。


小数は50字ごとに改行せよ。

解法

筆算の割り算をしていく。すなわち、非除数に10をかけてmで割って……を繰り返す。
同じ余りが出たらそれは循環しているということなので、そこで終了する。

ソースコード

int n,m,r[1000];

int main()
{
	while(scanf("%d%d",&n,&m),m)
	{
		rep(i,m)r[i]=-1;
		putchar('.');
		for(int i=0,j=1;;i++,j++)
		{
			if(r[n]>=0)
			{
				printf("\nThe last %d digits repeat forever.\n",i-r[n]);
				break;
			}
			r[n]=i;
			if(j%50==0)puts("");
			putchar('0'+n*10/m); n=n*10%m;
			if(n==0)
			{
				puts("\nThis expansion terminates."); break;
			}
		}
	}
	return 0;
}