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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PAT乙类1005之继续(3n+1)猜想 (25 分)

發(fā)布時(shí)間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT乙类1005之继续(3n+1)猜想 (25 分) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、 題目

卡拉茲(Callatz)猜想已經(jīng)在1001中給出了描述。在這個(gè)題目里,情況稍微有些復(fù)雜。 當(dāng)我們驗(yàn)證卡拉茲猜想的時(shí)候,為了避免重復(fù)計(jì)算,可以記錄下遞推過(guò)程中遇到的每一個(gè)數(shù)。例如對(duì) n=3 進(jìn)行驗(yàn)證的時(shí)候,我們需要計(jì)算 3、5、8、4、2、1,則當(dāng)我們對(duì) n=5、8、4、2 進(jìn)行驗(yàn)證的時(shí)候,就可以直接判定卡拉茲猜想的真?zhèn)?#xff0c;而不需要重復(fù)計(jì)算,因?yàn)檫@ 4 個(gè)數(shù)已經(jīng)在驗(yàn)證3的時(shí)候遇到過(guò)了,我們稱 5、8、4、2 是被 3“覆蓋”的數(shù)。我們稱一個(gè)數(shù)列中的某個(gè)數(shù) n 為“關(guān)鍵數(shù)”,如果 n 不能被數(shù)列中的其他數(shù)字所覆蓋。 現(xiàn)在給定一系列待驗(yàn)證的數(shù)字,我們只需要驗(yàn)證其中的幾個(gè)關(guān)鍵數(shù),就可以不必再重復(fù)驗(yàn)證余下的數(shù)字。你的任務(wù)就是找出這些關(guān)鍵數(shù)字,并按從大到小的順序輸出它們。輸入格式: 每個(gè)測(cè)試輸入包含 1 個(gè)測(cè)試用例,第 1 行給出一個(gè)正整數(shù) K (<100),第 2 行給出 K 個(gè)互不相同的待驗(yàn)證的正整數(shù) n (1<n≤100)的值,數(shù)字間用空格隔開(kāi)。輸出格式: 每個(gè)測(cè)試用例的輸出占一行,按從大到小的順序輸出關(guān)鍵數(shù)字。數(shù)字間用 1 個(gè)空格隔開(kāi),但一行中最后一個(gè)數(shù)字后沒(méi)有空格。輸入樣例: 6 3 5 6 7 8 11 輸出樣例: 7 6

二、代碼

  • 新的函數(shù)
  • sort函數(shù)
    Sort(start,end,cmp)
    參數(shù)
    (1)start表示要排序數(shù)組的起始地址;
    (2)end表示數(shù)組結(jié)束地址的下一位;
    (3)cmp用于規(guī)定排序的方法,可不填,默認(rèn)升序。

    如果記不住默認(rèn)升序,可以重新定義cmp函數(shù)!!!
    bool cmp(int a, int b) {
    return a > b;
    }
    • 核心思想
  • 定義兩個(gè)數(shù)組,一個(gè)用來(lái)存儲(chǔ),另一個(gè)用來(lái)標(biāo)榜是不是已經(jīng)被“覆蓋過(guò)了”!!
    Attention!!! 被覆蓋的不包含n本身,這個(gè)時(shí)候a[n]還等于1,它還沒(méi)有被覆蓋!!!
    • 易錯(cuò)點(diǎn)
      1)while(n != 1) 的位置; 還是那個(gè)問(wèn)題,n不是被覆蓋的數(shù),被它求出來(lái)的數(shù)才是被覆蓋的!! 所以while(n != 1) 要寫(xiě)在判斷是不是覆蓋數(shù)的外面
      2)審題問(wèn)題; 注意n不是等于 3 * n + 1, 而是一半
    #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; bool cmp(int a, int b) {return a > b; }int main() {int count, n, i=0;int a[10000] ={0};int ccNum[110] = {0};cin>>count;while(count --) {cin >> n;///while(n != 1) { while在這里是不對(duì)的(原想等于2就不用再循環(huán)了,才發(fā)現(xiàn)直接成死循環(huán)了) if(a[n] == 2) { //如果已經(jīng)被覆蓋了,就不用再繼續(xù)往下了 continue; }a[n] = 1; //如果沒(méi)有被覆蓋,則等于1 (因?yàn)檫@是n,不是被覆蓋的數(shù)) while(n != 1) {if(n % 2) {a[(3 * n + 1)/2] = 2; //這才是被覆蓋的數(shù) n = (3 * n + 1)/2; //n不是等于 3 * n + 1}else{a[n / 2] = 2;n = n / 2;}}}for(int j=1; j<110; j++) {if(a[j] == 1) {ccNum[i++] = j;}}sort(ccNum, ccNum + i, cmp);for(int j=0; j<i; j++) {printf("%d", ccNum[j]);if(j != i - 1) {printf(" ");}}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的PAT乙类1005之继续(3n+1)猜想 (25 分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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