PAT (Basic Level) Practise - 继续(3n+1)猜想
?
題目鏈接:https://www.patest.cn/submissions/4414905
1005. 繼續(3n+1)猜想 (25)
時間限制 400 ms 內存限制 65536 kB 代碼長度限制 8000 B 判題程序 Standard 作者 CHEN, Yue卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目里,情況稍微有些復雜。
當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。例如對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 6C/C++版代碼1:
?
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() {int K,k=0; //K用來存a數組的下標,k用來存b數組的下標int a[100],b[10000]; //a數組用來存輸入用例,b數組用來存被覆蓋的值memset(a,0,sizeof(a));memset(b,0,sizeof(b));scanf("%d", &K);for(int i=0; i<K; i++){scanf("%d", &a[i]);int temp = a[i];while(temp!=1){if(temp%2==0){temp /= 2;}else{temp = (3*temp+1)/2;}int flag=0; //判斷此被覆蓋的值是否已經存在于b數組,0代表不存在for(int j=0;j<100;j++){if(temp == b[j])flag = 1;}if(!flag) //若已存在則不存第二次了b[k++] = temp;}}int key[100], l=0; //key數組用來存關鍵字, l存key的下標memset(key, 0, sizeof(key));for(int i=0; i<K; i++) //遍歷a數組的每一個數,尋找在b中不存在的,存入key {int flag=0;for(int j=0; j<k; j++){if(a[i] == b[j]){flag = 1;break;}}if(!flag){key[l++] = a[i];}}sort(key, key+l);if(key[l-1]) //從大到小輸出printf("%d",key[l-1]);for(int i=l-2; i>=0; i--){printf(" %d",key[i]);}return 0; }?
C/C++版代碼二:
思路分析:打表題,對于每個輸入的值進行驗證操作,對于每一步的數字都存儲在數組中,之后便是每個數字進行確認,是否在之前驗證過程中出現,以降序排序,依次輸出即可。
注意:a數組和key數組的大小可以用100,但b數組最小得10000,因為覆蓋的值可能很大,容易發生數組越界(段錯誤)
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int a[100],b[10000],key[100]; //a數組用來存輸入用例,b數組用來存被覆蓋的值,key數組用來存關鍵字void fun(int n) //判斷a中每一個數,將其覆蓋的數存入b的下標 {while(n!=1){if(n%2==0){n /= 2;}else{n = (3*n+1)/2;}b[n] = 1;} } int main() {int K,l=0; //l是key數組的下標memset(a, 0, sizeof(a)); //將 a,b,key全部賦0memset(b, 0, sizeof(b));memset(key, 0, sizeof(key));scanf("%d", &K);for(int i=0; i<K; i++){scanf("%d", &a[i]);fun(a[i]);}for(int i=0; i<K; i++){if(b[a[i]] == 0){key[l++] = a[i];}}sort(key,key+l);printf("%d", key[l-1]);for(int i=l-2; i>=0; i--){printf(" %d", key[i]);}return 0; }?
轉載于:https://www.cnblogs.com/tanrong/p/8506971.html
總結
以上是生活随笔為你收集整理的PAT (Basic Level) Practise - 继续(3n+1)猜想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络编程-之粘包现象
- 下一篇: thinkPHP学习笔记