3n+1猜想(求关键数)
生活随笔
收集整理的這篇文章主要介紹了
3n+1猜想(求关键数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目如下
當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3 進行驗證的時候,我們需要計算
3、5、8、4、2、1,則當我們對 n=5、8、4、2 進行驗證的時候,就可以直接判定卡拉茲猜想的真偽,而不需要重復計算,因為這 4
個數已經在驗證3的時候遇到過了,我們稱 5、8、4、2 是被 3“覆蓋”的數。我們稱一個數列中的某個數 n 為“關鍵數”,如果 n
不能被數列中的其他數字所覆蓋。
現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重復驗證余下的數字。你的任務就是找出這些關鍵數字,并按從大到小的順序輸出它們。
輸入格式:
每個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<100),第 2 行給出 K 個互不相同的待驗證的正整數 n (1<n≤100)的值,數字間用空格隔開。
輸出格式:
每個測試用例的輸出占一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最后一個數字后沒有空格。
輸入樣例:
6
3 5 6 7 8 11
輸出樣例:
7 6
理解有誤的版本
自己將輸入樣例中6個數的所有卡拉茲序列分別求出來,互相比較,不取其中重復的數字,將剩余的進行輸出。代碼如下:
#include<iostream> int main() {using namespace std;int sum;cin >> sum;int res[100] = { 0 };//保存過程序列int flag[100] = { 0 };//標記是否為'關鍵數'int i, j, t, h = 0;bool pp;//標記此輪是否在序列中找出一個關鍵數for (i = 0; i < sum; ++i){cin >> t;while (t != 1)//t為1時,序列結束,即一輪循環結束。{pp = false;for (j = 0; res[j] != 0; ++j){if (t == res[j]){flag[j] = 1;pp = true;break;}}if (pp == false){res[h++] = t;//保存未曾出現過的新序列值,用下標h來表示其個數。if (t % 2)t = (3 * t + 1) / 2;elset = t / 2;}elsebreak;//若t已找到的對應的序列值,跳出,檢查下一個t值。}}//關鍵數已全部找出。//進行從大到小的排序,輸出。int u, index;t = 1;//標記變量用來判斷此次的序列值是否為最后一個,若是最后一個不需要輸出空格符。while (t != 0){u = 0;t = 0;for (i = 0; i < h; ++i){if (flag[i] == 0){t += 1;if (res[i] > u){u = res[i];index = i;}}}flag[index] = true;if (t > 1)cout << u << ' ';else if (t == 1){cout << u;break;}}return 0; }當輸入為上面樣例中的數時,輸出如下:
PTA上正確的版本
糾正后的代碼如下:
#include<iostream> int main() {using namespace std;int sum, i, j, k;cin >> sum;int number[100] = { 0 };int flag[100] = { 0 };for (i = 0; i < sum; ++i)cin >> number[i];//輸入所有數據for (i = 0; i < sum; ++i)//對每一個number[i]的序列值挨個與其他元素比較{if (flag[i] == 0){j = number[i];while (j != 1){if (j % 2)j = (3 * j + 1) / 2;elsej = j / 2;for (k = 0; k < sum; ++k){if (j == number[k]){if (flag[k] == 0)flag[k] = 1;//對重復的元素(非關鍵數)標記為1.break;}}}}}//排序輸出int t = 1,index;while (t != 0){j = 0;t = 0;for (i = 0; i < sum; ++i){if (flag[i] == 0){t += 1;if (number[i] > j){j = number[i];index = i;}}}flag[index] = 1;if (t > 1)cout << j << ' ';else if (t == 1){cout << j;break;}}return 0; }輸出為:
總結
以上是生活随笔為你收集整理的3n+1猜想(求关键数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈希表(散列查找)(c/c++)
- 下一篇: C/C++编程的一些技巧