日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3n+1猜想(求关键数)

發布時間:2025/6/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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猜想(求关键数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。