雙碼二部數定義:由兩個不同數碼組成,每個數碼多於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協議分析...