/**********************************************************************
* プログラミング演習 レポート課題
* B-2 サンプルデータ 3
* (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
*-------------------------------------------------------------------
*
* 2 つの自然数 x, y を読み込み, x/y の値を小数点以下 100 桁まで表示.
* ただし,循環小数になる場合は,循環する範囲を [ ] で囲んで表示する.
*
**********************************************************************/
#include <stdio.h>
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;
}