雙碼二部數序列

2021-07-26 02:34:05 字數 2041 閱讀 3524

雙碼二部數定義:由兩個不同數碼組成,每個數碼多於1位時相連而不分開的正整數稱為雙碼二部數,其中處於高位相連數字稱為高部,處於低位相連數字稱為低部

例如330是乙個3位雙碼二部數:高部數字為3,高部位數為2;低部數字為0,底部位數為1,而333只有乙個數碼,4407有三個數碼,4474的數碼4呈分開狀態,都不是雙碼二部數;

試統計n位雙碼二部數的個數,並求出n位雙碼二部數從小到大排序序列的第m項;

輸入正整數n(1< n< 10000)與m,輸出n位雙碼二部數的個數,同時輸出n位雙碼二部數序列的第m項的高部數字(高部位數)和低部數字(底部位數),如果m大於n位雙碼二部數的個數,則輸出「0」;

1.遞增列舉要點:

設n(n>1)位雙碼二部數為a……ab……b(1<=a<=9,0<=b<=9),其高部數字a有la位,低部數字b有lb位,顯然有:

為了確保從小到大列舉雙碼二部數,要注意列舉迴圈的先後次序:首先,高部數字a必須從小到大,範圍為1~9;當a確定後,高部位數la簡單地從小到大或從大到小都不能確保雙碼二部數從小到大變化,需要配合b分以下3步完成,為便於理解,以n=4,a=4的遞增程序實施標註;

(1)、la增長(1~n-2)段,lb=n-la,b遞增(0~a-1)取值;

4000

4111

4222

4333

(la=1, lb=3, b: 0~3)

4400

4411

4422

4433

(la=2, lb=2, b: 0~3)

(2)、la與lb取定值段,la=n-1,lb=1,b遞增(0~9)取值(當b=a時跳過);

4440

4441

4442

4443

4445

4446

4447

4448

4449

(la=3, lb=1, b: 0~9, 其中b=4時跳過)

(3)、la減小(n-2~1)段,lb=n-la,b遞增(a+1~9)取值;

4455

4466

4477

4488

4499

(la=2, lb=2, b: 5~9)

4555

4666

4777

4888

4999

(la=1, lb=3, b: 5~9)

以上3步驟中每一步驟都是遞增的,且3個步驟銜接中沒有重複與遺漏,從而可能確保n位的雙碼二部數從小到大遞增,沒有重複與遺漏;

2.列舉程式設計:

#include#includeint main()}}

la=n-1;

lb=1;

for(b=0;b<=9;b++)}}

for(la=n-2;la>=1;la--)}}

}if(s>=m)

printf(" %ld,%d(%d)%d(%d)\n",s,a0,la0,b0,n-la0);

else

printf(" %ld,%d\n",s,0);

}

3.簡化列舉迴圈設計:

#includeint main()

4.程式執行示例及其注意事項:

請輸入整數n,m: 40,2017

3159,6(30)7(10)

可知40位雙碼二位數共有3159個,40位雙碼二部數公升序序列的第2017項高部30個「6」,低部10個「7」;

由第2017項的資料看似非常大,但列舉次數只有3159次;

列舉迴圈次數即n為雙碼二部數的個數,隨著n的增大運算顯著增長,但對於n<10000,列舉時間是可以接受的;

雙碼二部數的遞增列舉是比較複雜的,也容易出錯,這一設計提醒我們不要輕視列舉,列舉設計可以解決一些較為複雜的搜尋案例;

專案二 第二部

1 使用vim編輯器配置網路 使用 setup 配置ip位址 service network restart 重新啟動網路服務 vim etc sysconfig network scripts ifcfg eth0 使用vim編輯器開啟網絡卡配置檔案 修改完相應的資訊後,按esc鍵,退出編輯模式,...

ElasticSeach(二 部署執行)

cluster 集群名稱,同一集群名稱需一致,預設 elasticsearch node 節點名稱,集群內節點名稱需唯一 node.name node 1 自定義屬性 node.attr.rack r1 當前節點是否儲存資料 node.data true 是否是主節點 node.master tru...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...