連結串列:3n+1數列問題!!!
Problem Description
有一天小標遇到了經典的3n+1數鏈問題,他想知道3n+1數鏈的前k個數是多少。
下面小標來給你介紹一下3n+1數鏈是什麼,
給定一個數n,如果n為偶數,那麼下一個數n1 = n / 2;否則n1 = 3 * n + 1;
如果n1為偶數,那麼下一個數n2 = n1 / 2;否則n2 = 3 * n1 + 1;
如果n2為偶數,那麼下一個數n3 = n2 / 2;否則n3 = 3 * n2 + 1;
…
小標最近剛剛學習了連結串列,他想把這兩個知識結合一下,所以,他想按照下面的規定去做。
①起始n為10,k為5,連結串列為空
②判斷n為偶數,他會往連結串列頭部加一個5(即n/2),此時連結串列中序列為5,n變為5 -> NULL
③接下來n== 5,判斷n為奇數,他會往連結串列尾部加一個16(即3*n+1),此時連結串列中序列為5 -> 16 -> NULL
④接下來n== 16,判斷n為偶數,他會往連結串列頭部加一個8(即n/2),此時連結串列中序列為8 -> 5 -> 16 -> NULL
⑤接下來n== 8,判斷n為偶數,他會往連結串列頭部加一個4(即n/2),此時連結串列中序列為4 - > 8 - > 5 -> 16 -> NULL
⑥接下來n== 4,判斷n為偶數,他會往連結串列頭部加一個2(即n/2),此時連結串列中序列為2 - > 4 - > 8 - > 5 -> 16 -> NULL
到此時,小標得到了前k個數,那麼輸出這個序列。
Ps: 為了變得更容易理解,簡單來說就是n為偶數,加在連結串列頭部,n為奇數,加在連結串列尾部
Input
多組輸入。
對於每組資料,每行兩個整數1 <= n , k <= 1000,含義如上
Output
輸出連結串列序列
Sample Input
10 5
Sample Output
2 4 8 5 16
#include<stdio.h> #include<stdlib.h> struct node { struct node *next; int data; }; int main() { int n, i, k; while(scanf("%d %d",&n,&k)!=EOF) { node *head = new node; //因為多組輸入,所以得在while裡面建立頭。 head ->next = NULL; node *tail = head; if(n%2 != 0) n = n*3 + 1; //×××××××××××××××××××× else n = n/2; node *p = new node; p->data = n; 這個範圍的東西很重要,得先給空頭插入一個數, p->next = NULL; 否則下面的頭插接不上。因為在下面的插入中,如果剛開始 tail->next = p; 就是頭插,tail的指向沒改變,還是跟著head!!!!! tail = p; //×××××××××××××××××××× for(i = 2; i <= k; i++) //這個for就容易理解了,偶數的話變成n/2,插到頭 { 奇數變成3×n+1 放到尾部。 if(n%2 != 0) { n = n*3 + 1; node *q = new node; q->data = n; q->next = NULL; tail->next = q; tail = q; } else { n = n/2; node *q = new node; q->data = n; q->next = head->next; head->next = q; } } for(node *p = head->next; p != NULL; p = p->next) { if(p->next!=NULL) printf("%d ",p->data); else printf("%d\n",p->data); } } return 0; }
加油鴨!!!!!