首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

NOJ 1167 丑陋數:三指針動態生成第 1500 個 Hamming 數

     編輯:關於C++

問題描述

丑陋數定義:質因子只包含 2,3,5。求前 1500 個丑陋數(第一個為 1)。多查詢輸出第 n 個。

三指針 O(n) 生成法

維護 ugly[i] 已生成序列,三指針 i2,i3,i5 分別指向下一個待乘 2/3/5 的位置。每次取 min(ugly[i2]*2, ugly[i3]*3, ugly[i5]*5) 作為下一個丑數,相等指針同步前移。

代碼實現

const int MAXN = 1510;
int ugly[MAXN];

int main() {
    ugly[1]=1;
    int i2=1,i3=1,i5=1;
    for (int i=2;i

關鍵點

  • 指針同步前移避免重複(如 6 = 2*3 = 3*2)。
  • 預計算前 1500 個,查詢 O(1)。
  • int 足夠(第 1500 個丑數 < 2^31)。

總結

NOJ 1167 是經典丑數問題的標準解法。三指針動態規劃思想極其優雅:每個新丑數必由舊丑數乘 2/3/5 得到,且按序生成。此模板直接適用於「只含給定質因子的有序序列」生成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved