主要思路:
通过模拟除法运算过程,来判断循环节结束的位置,不断将余数*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 #include <stdio.h> 2 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<i; j++) 22 if(numerator[j] == numerator[i]) 23 break; 24 if(j < i) { 25 start = j; 26 end = i - 1; 27 break; 28 } 29 if(numerator[i] == 0) { 30 start = i; 31 end = i; 32 break; 33 } 34 } 35 36 printf("%d/%d = %d.", n, d, n / d); 37 for(i=0; i<start; i++) 38 printf("%d", decimal[i]); 39 printf("("); 40 if(end - start + 1 > 50) { 41 for(i=start; i<start+50; i++) 42 printf("%d", decimal[i]); 43 printf("..."); 44 } else { 45 for(i=start; i<=end; i++) 46 printf("%d", decimal[i]); 47 } 48 printf(")\n"); 49 printf(" %d = number of digits in repeating cycle\n\n", end - start + 1); 50 } 51 52 return 0; 53 }