主要思路:
通过模拟除法运算过程,来判断循环节结束的位置,不断将余数*10再对除数取余得到新的余数,并记录下来,知道出现的余数之前出现过,此时小数开始循环。
例如:
假设 -> a 是商 b是余数
(1/7) -> (1) a=1/7=0, b=1%7=1;
(2) a=(b*10)/7=1 , b=(b*10)%7=3;
(3) a=(b*10)/7=4 , b=(b*10)%7=2;
(4) a=(b*10)/7=2 , b=(b*10)%7=6;
(5) a=(b*10)/7=8 , b=(b*10)%7=4;
(6) a=(b*10)/7=5 , b=(b*10)%7=5;
(7) a=(b*10)/7=7 , b=(b*10)%7=1; //与已有的余数相同开始循环
(8) a=(b*10)/7=1 , b=(b*10)%7=3;
AC代码:
1 #include2 3 #define MAXN 3000 4 5 int decimal[MAXN]; 6 int numerator[MAXN]; 7 8 int main(void) 9 {10 int n, d, start, end, i, j;11 12 while(scanf("%d%d", &n, &d) != EOF) {13 i = 0;14 numerator[i] = n % d;15 decimal[i] = numerator[i] * 10 / d;16 17 for(i=1; ;i++) {18 numerator[i] = numerator[i-1] * 10 % d;19 decimal[i] = numerator[i] * 10 / d;20 21 for(j=0; j 50) {41 for(i=start; i