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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PAT (Basic Level) Practise - 继续(3n+1)猜想

發(fā)布時間:2024/9/5 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT (Basic Level) Practise - 继续(3n+1)猜想 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

題目鏈接:https://www.patest.cn/submissions/4414905

1005. 繼續(xù)(3n+1)猜想 (25)

時間限制 400 ms 內(nèi)存限制 65536 kB 代碼長度限制 8000 B 判題程序 Standard 作者 CHEN, Yue

卡拉茲(Callatz)猜想已經(jīng)在1001中給出了描述。在這個題目里,情況稍微有些復雜。

當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數(shù)。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想的真?zhèn)?#xff0c;而不需要重復計算,因為這4個數(shù)已經(jīng)在驗證3的時候遇到過了,我們稱5、8、4、2是被3“覆蓋”的數(shù)。我們稱一個數(shù)列中的某個數(shù)n為“關(guān)鍵數(shù)”,如果n不能被數(shù)列中的其他數(shù)字所覆蓋。

現(xiàn)在給定一系列待驗證的數(shù)字,我們只需要驗證其中的幾個關(guān)鍵數(shù),就可以不必再重復驗證余下的數(shù)字。你的任務就是找出這些關(guān)鍵數(shù)字,并按從大到小的順序輸出它們。

輸入格式:每個測試輸入包含1個測試用例,第1行給出一個正整數(shù)K(<100),第2行給出K個互不相同的待驗證的正整數(shù)n(1<n<=100)的值,數(shù)字間用空格隔開。

輸出格式:每個測試用例的輸出占一行,按從大到小的順序輸出關(guān)鍵數(shù)字。數(shù)字間用1個空格隔開,但一行中最后一個數(shù)字后沒有空格。

輸入樣例: 6 3 5 6 7 8 11 輸出樣例: 7 6

C/C++版代碼1:

?

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() {int K,k=0; //K用來存a數(shù)組的下標,k用來存b數(shù)組的下標int a[100],b[10000]; //a數(shù)組用來存輸入用例,b數(shù)組用來存被覆蓋的值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; //判斷此被覆蓋的值是否已經(jīng)存在于b數(shù)組,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數(shù)組用來存關(guān)鍵字, l存key的下標memset(key, 0, sizeof(key));for(int i=0; i<K; i++) //遍歷a數(shù)組的每一個數(shù),尋找在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++版代碼二:

思路分析:打表題,對于每個輸入的值進行驗證操作,對于每一步的數(shù)字都存儲在數(shù)組中,之后便是每個數(shù)字進行確認,是否在之前驗證過程中出現(xiàn),以降序排序,依次輸出即可。

注意:a數(shù)組和key數(shù)組的大小可以用100,但b數(shù)組最小得10000,因為覆蓋的值可能很大,容易發(fā)生數(shù)組越界(段錯誤)

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int a[100],b[10000],key[100]; //a數(shù)組用來存輸入用例,b數(shù)組用來存被覆蓋的值,key數(shù)組用來存關(guān)鍵字void fun(int n) //判斷a中每一個數(shù),將其覆蓋的數(shù)存入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數(shù)組的下標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; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/tanrong/p/8506971.html

總結(jié)

以上是生活随笔為你收集整理的PAT (Basic Level) Practise - 继续(3n+1)猜想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。