數字鏈表

來源:互聯網
上載者:User
#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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.