/********************************************************************** * プログラミング演習 レポート課題 * B-2 サンプルデータ 3 * (C) 2006 Hirohisa AMAN *------------------------------------------------------------------- * * 2 つの自然数 x, y を読み込み, x/y の値を小数点以下 100 桁まで表示. * ただし,循環小数になる場合は,循環する範囲を [ ] で囲んで表示する. * **********************************************************************/ #include int main(void){ int x, y, i, j; int begin, end; /* 循環小数の始まりと終りの位置 */ int quo[100], mod[100]; /* 商と余りの配列 */ /* x, y の読み込み */ do{ printf("x(>0) = ? "); scanf("%d", &x); } while( x <= 0 ); do{ printf("y(>0) = ? "); scanf("%d", &y); } while( y <= 0 ); /* 整数部分の表示 */ printf("x/y = %d", x/y); x %= y; if ( x == 0 ){ printf("\n"); return 0; } /* 小数部分の表示 */ begin = end = 100; printf("."); for ( i = 0; i < 100; i++ ){ if ( x == 0 ){ /* 割りきれた場合,そこでストップ */ break; } mod[i] = x; x *= 10; quo[i] = x/y; x %= y; for ( j = 0; j < i; j++ ){ /* 以前に同じ余りがあれば,循環小数 */ if ( mod[j] == mod[i] ){ begin = j; end = i; break; } } if ( begin != 100 ){ break; } } j = 0; while ( j < begin && j < i ){ printf("%d", quo[j]); j++; } if ( begin < 100 ){ printf("["); for ( j = begin; j < end; j++ ){ printf("%d", quo[j]); } printf("]"); for ( j = end; j < i; j++ ){ printf("%d", quo[j]); } } printf("\n"); return 0; }