#include <algorithm>#include <iostream>using namespace std;#define N 100000struct NODE {int val; NODE* next; };NODE *pos[N]; /* pos[i] = x 表示餘數i出現的節點的地址為x */bool done[N]; /* done[i] 表示餘數i已經處理過 */int main(){int m, n;while ( scanf("%d%d", &m, &n) != EOF ){memset (done, 0, sizeof(done)); // 初始化為空白memset (pos, NULL, sizeof(pos)); // 初始化為空白NODE ipart, fpart; /* ipart節點儲存整個整數部分的值, fpart儲存小數部分的值,每個節點儲存一個字元 */NODE *recycle, *p; /* recycle記錄無限迴圈的起點, p是臨時指標 */ipart.val = m / n; fpart.next = recycle = NULL;p = &fpart;m = ( m % n ) * 10; while ( m != 0 ){if ( done[m % n] ) // 若m % n 的餘數已經處理過,且再度出現,那麼可以確定為無限迴圈小數 {p->next = pos[m % n]; // 節點的下一個位置指向迴圈的起點recycle = pos[m % n]; // 記錄迴圈的起點break;}p->next = new (NODE);p->next->next = NULL;done[m % n] = true;pos[m % n] = p->next;p->next->val = m / n;m = ( m % n ) * 10;p = p->next;}printf("%d",ipart.val); // 輸出整數部分,若小數部分有值存在,那麼輸出小數點if ( fpart.next != NULL ) putchar('.');int cnt = 0; // cnt 記錄迴圈的次數,本題要求輸出迴圈兩次,故當cnt==3時便跳出p = fpart.next;while ( p != NULL ){if ( p == recycle && recycle != NULL ) {cnt++;if ( cnt == 3 ) break; //注意迴圈兩次的話,記錄因該是3}printf("%d",p->val);p = p->next;}printf("\n\n");}return 0;}