1. 程式人生 > >連結串列:3n+1數列問題!!!

連結串列: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;
}

                             加油鴨!!!!!