問題描述:
有一天小標遇到了經典的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
③接下來n5,判斷n為奇數,他會往鍊錶尾部加乙個16(即3*n+1),此時鍊錶中序列為5 -> 16 -> null
④接下來n16,判斷n為偶數,他會往鍊錶頭部加乙個8(即n/2),此時鍊錶中序列為8 -> 5 -> 16 -> null
⑤接下來n8,判斷n為偶數,他會往鍊錶頭部加乙個4(即n/2),此時鍊錶中序列為4 - > 8 - > 5 -> 16 -> null
⑥接下來n4,判斷n為偶數,他會往鍊錶頭部加乙個2(即n/2),此時鍊錶中序列為2 - > 4 - > 8 - > 5 -> 16 ->
null 到此時,小標得到了前k個數,那麼輸出這個序列。 ps:
為了變得更容易理解,簡單來說就是n為偶數,加在鍊錶頭部,n為奇數,加在鍊錶尾部
多組輸入。 對於每組資料,每行兩個整數1 <= n , k <= 1000,含義如上輸出:
輸出鍊錶序列示例輸入:
10 5
示例輸出:
2 4 8 5 16
解題思路:
這題要頭結點反而麻煩。直接設定head和tail指標,指向鍊錶的頭結點和尾結點。如果是偶數,則運算後新增在頭結點之前,更新頭結點指標head的值,使之總指向頭結點。ac**:如果是奇數,則運算後新增在尾結點之後,更新尾結點指標tail的值,使之總指向尾結點。
最後說一下,我們用引用的方式進行傳值的。這種用法會使函式有能力操作實參的所有屬性。比如說,如果在main函式中使l指向了某個結點,那麼在函式中使l指向另乙個結點,等函式返回之後這個改動是不生效的。但是如果通過引用方式來傳值的話,這個改動就會生效了。
#include #include using namespace std;
typedef struct lnodelnode, *linklist;
void solution(linklist &l,int n,int k)
else
}else
else}}
l = head;
}int main() else
tmp = tmp->next;
}cout << endl;
}return 1;
}
3n 1數列問題 SDUT
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 ...
3n 1數列問題
time limit 1000ms memory limit 65536k 有一天小標遇到了經典的3n 1數鏈問題,他想知道3n 1數鏈的前k個數是多少。下面小標來給你介紹一下3n 1數鏈是什麼,給定乙個數n,如果n為偶數,那麼下乙個數n1 n 2 否則n1 3 n 1 如果n1為偶數,那麼下乙個數...
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 ...