1. 程式人生 > >循環小數——模擬除法

循環小數——模擬除法

urn 表示 ati tail algo esp print pan 數組模擬

題目

輸入整數a和b(0 ≤ a ≤ 3000,1 ≤ b ≤ 3000),輸出a / b的循環小數表示以及循環節的長度。例如a = 5,b = 43,小數表示為0.(116279069767441860465),循環節的長度為21。

解題思路

用模擬除法,並用數組模擬每次存儲每次相除的結果,每除一次與前面的所有元素比較一次,如果與數組中某一元素相等,即可停止循環,因為此時循環節已經找到,並用變量m、n分別記錄循環節的起始和終止位置,然後就是按規定的格式輸出。

代碼實現

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4
#include<cstring> 5 using namespace std; 6 7 const int maxn = 3000 + 10; 8 int a, b; 9 int frac[maxn],pos[maxn],yu[maxn]; 10 11 int main() 12 { 13 while (scanf("%d%d",&a,&b) == 2) 14 { 15 int tmp = a; 16 memset(frac, 0, sizeof(frac)); 17 memset(pos, 0, sizeof
(pos)); 18 memset(yu, 0, sizeof(yu)); 19 20 int cnt = 0; 21 frac[cnt++] = a / b; 22 a = a % b; 23 24 while (!pos[a] && a) 25 { 26 yu[cnt] = a;             //記錄每個余數 27 pos[a] = cnt;            //記錄每個余數的位置 28 frac[cnt++] = (a * 10
) / b;    //記錄商 29 a = (a * 10) % b; 30 } 31 32 printf("%d %d = %d.", tmp, b, frac[0]); 33 for (int i = 1; i <= 50 && i < cnt; i++) 34 { 35 if (a & yu[i] == a) printf("(");  //利用了循環節前一個和循環節最後一個的余數相同 36 printf("%d", frac[i]); 37 } 38 if (!a) 39 printf("(0"); 40 if (cnt > 50) 41 printf("..."); 42 printf(")\n"); 43 printf(" %d = number of digits in repeating cycle\n\n", a == 0 ? 1 : cnt - pos[a]); 44 } 45 return 0; 46 }

參考鏈接:https://blog.csdn.net/qiweigo/article/details/43051043

循環小數——模擬除法