45

素因数が2、3、または5しかない数は、醜い数と呼ばれます。

例:

1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... 

1は2^0と見なすことができます。

私はn番目の醜い数を見つけることに取り組んでいます。これらの数値は、n大きくなるにつれて非常にまばらに分布することに注意してください。

与えられた数が醜いかどうかを計算する簡単なプログラムを書きました。のためn > 500に-それは超遅くなりました。私はメモ化を使用してみました-観察:、、ugly_number * 2ugly_number * 3すべてugly_number * 5醜いです。それでも遅いです。logのいくつかのプロパティを使用してみましたが、乗算から加算までこの問題が軽減されるためですが、まだあまり運がありません。これを皆さんと共有することを考えました。面白いアイデアはありますか?

エラトステネスのふるいに似た概念を使用する(アノンに感謝)

    for (int i(2), uglyCount(0); ; i++) {
        if (i % 2 == 0)
            continue;
        if (i % 3 == 0)
            continue;
        if (i % 5 == 0)
            continue;
        uglyCount++;
        if (uglyCount == n - 1)
            break;
    }

in番目の醜い数です。

これでもかなり遅いです。私は1500番目の醜い番号を見つけようとしています。

4

13 に答える 13

41

Javaのシンプルで高速なソリューション。アノンによって記述されたアプローチを使用します。。
これTreeSetは、その中の最小の要素を返すことができる単なるコンテナです。(重複は保存されません。)

    int n = 20;
    SortedSet<Long> next = new TreeSet<Long>();
    next.add((long) 1);

    long cur = 0;
    for (int i = 0; i < n; ++i) {
        cur = next.first();
        System.out.println("number " + (i + 1) + ":   " + cur);

        next.add(cur * 2);
        next.add(cur * 3);
        next.add(cur * 5);
        next.remove(cur);
    }

1000番目の醜い数は51200000であるため、それらを格納することbool[]は実際にはオプションではありません。

編集
仕事からのレクリエーション(愚かなHibernateのデバッグ)として、これは完全に線形のソリューションです。アイデアをくれたmarcogに感謝します!

    int n = 1000;

    int last2 = 0;
    int last3 = 0;
    int last5 = 0;

    long[] result = new long[n];
    result[0] = 1;
    for (int i = 1; i < n; ++i) {
        long prev = result[i - 1];

        while (result[last2] * 2 <= prev) {
            ++last2;
        }
        while (result[last3] * 3 <= prev) {
            ++last3;
        }
        while (result[last5] * 5 <= prev) {
            ++last5;
        }

        long candidate1 = result[last2] * 2;
        long candidate2 = result[last3] * 3;
        long candidate3 = result[last5] * 5;

        result[i] = Math.min(candidate1, Math.min(candidate2, candidate3));
    }

    System.out.println(result[n - 1]);

アイデアは、を計算するために、いくつかa[i]に使用できるということです。ただし、1)と2)が可能な限り最小であることも確認する必要があります。 次に、。a[j]*2j < ia[j]*2 > a[i - 1]j
a[i] = min(a[j]*2, a[k]*3, a[t]*5)

于 2011-01-05T01:26:26.983 に答える
12

私はn番目の醜い数を見つけることに取り組んでいます。nが大きくなると、これらの数値は非常にまばらに分布することに注意してください。

与えられた数が醜いかどうかを計算する簡単なプログラムを書きました。

これは、解決しようとしている問題に対する間違ったアプローチのように見えます。これは、ちょっとしたシュレミエルアルゴリズムです。

素数を見つけるためのエラトステネスのふるいアルゴリズムに精通していますか?同様の何か(すべての醜い数が別の醜い数の2、3、または5倍であるという知識を利用する)は、おそらくこれを解決するためにうまくいくでしょう。

ふるいとの比較で、私は「あなたが上がるにつれて、一連のブールを維持し、可能性を排除する」という意味ではありません。以前の結果に基づいてソリューションを生成する一般的な方法について詳しく説明します。Sieveが数値を取得し、その倍数をすべて候補セットから削除する場合、この問題の適切なアルゴリズムは、空のセットから開始し、各醜い数値の正しい倍数をそれに追加します。

于 2011-01-05T01:23:56.763 に答える
9

私の答えは、 NikitaRybakによって与えられた正解を指します。そのため、最初のアプローチのアイデアから2番目のアプローチのアイデアへの移行を見ることができます。

from collections import deque
def hamming():
    h=1;next2,next3,next5=deque([]),deque([]),deque([])
    while True:
        yield h
        next2.append(2*h)
        next3.append(3*h)
        next5.append(5*h)
        h=min(next2[0],next3[0],next5[0])
        if h == next2[0]: next2.popleft()
        if h == next3[0]: next3.popleft()
        if h == next5[0]: next5.popleft()

Nikita Rybakの最初のアプローチからの変更点は、次の候補を単一のデータ構造、つまりツリーセットに追加する代わりに、それぞれを3つのFIFOリストに個別に追加できることです。このように、各リストは常にソートされたままになり、次に少ない候補は常にこれらのリストの1つ以上の先頭にある必要があります。

上記の3つのリストの使用を排除すると、NikitaRybakの回答の2番目の実装に到達します。これは、必要な場合にのみそれらの候補(3つのリストに含まれる)を評価することによって行われるため、それらを保存する必要はありません。

簡単に言えば

最初のアプローチでは、すべての新しい候補を単一のデータ構造に入れますが、あまりにも多くのものが賢明に混同されないため、それは悪いことです。この貧弱な戦略は、構造にクエリを実行するたびに、必然的にO(log(tree size))時間の複雑さを伴います。ただし、それらを別々のキューに入れると、各クエリがO(1)のみを使用することがわかります。そのため、全体的なパフォーマンスはO(n)に低下します。これは、3つのリストのそれぞれがすでにそれ自体でソートされているためです。

于 2012-01-25T17:18:08.367 に答える
6

この問題は、おそらくO(n ^ {2/3})の劣線形時間で解決できると思います。

アイデアを与えるために、問題を単純化して2と3の因数を許容する場合、少なくとも2の最小の累乗を検索することから始めて、O(n ^ {1/2})時間を達成できます。 n番目の醜い数、そしてO(n ^ {1/2})候補のリストを生成します。このコードはあなたにそれを行う方法のアイデアを与えるはずです。これは、2と3の累乗のみを含むn番目の数が、指数の合計がO(n ^ {1/2})である素因数分解を持っているという事実に依存しています。

def foo(n):
  p2 = 1  # current power of 2
  p3 = 1  # current power of 3
  e3 = 0  # exponent of current power of 3
  t = 1   # number less than or equal to the current power of 2
  while t < n:
    p2 *= 2
    if p3 * 3 < p2:
      p3 *= 3
      e3 += 1
    t += 1 + e3
  candidates = [p2]
  c = p2
  for i in range(e3):
    c /= 2
    c *= 3
    if c > p2: c /= 2
    candidates.append(c)
  return sorted(candidates)[n - (t - len(candidates))]

同じアイデアが3つの許可された要素に対して機能するはずですが、コードはより複雑になります。因数分解の累乗の合計はO(n ^ {1/3})に下がりますが、より正確には、より多くの候補O(n ^ {2/3})を考慮する必要があります。

于 2011-01-05T06:40:32.127 に答える
6

ここには多くの良い答えがありますが、特に、受け入れられたものを含め、これらの答えのいずれかがダイクストラの元の論文の公理2をどのように維持しているかを理解するのに苦労していました:

公理2.xがシーケンス内にある場合、2 * x、3 * x、および5*xもシーケンス内にあります。

ホワイトボードを作成した後、公理2はアルゴリズムの各反復で不変ではなく、実際にはアルゴリズム自体の目標であることが明らかになりました。各反復で、公理2の条件を復元しようとします。lastが結果シーケンスの最後の値である場合S、公理2は単純に次のように言い換えることができます。

の一部xS場合、の次の値は、、、およびの最小値でありS2xは 。より大きくなります。これを公理2'と呼びましょう。3x5xlast

したがって、を見つけることができれば、、、の最小値を一定時間でx計算し、それをに追加することができます。2x3x5xS

しかし、どうやって見つけるのでしょうxか?1つのアプローチは、そうではありません。代わりに、に新しい要素を追加するたびに、、、、eおよびをS計算2eし、それらを最小優先度キューに追加します。この操作はにあることを保証するので、PQの最上位要素を抽出するだけで公理2'を満たします。3e5eeS

このアプローチは機能しますが、問題は、最終的に使用しない可能性のある多数の数値を生成することです。例については、この回答を参照してください。ユーザーがS(5)の5番目の要素が必要な場合、その時点でのPQは保持されます6 6 8 9 10 10 12 15 15 20 25。このスペースを無駄にできませんか?

結局のところ、私たちはもっとうまくやることができます。これらすべての数値を格納する代わりに、倍数ごとに3つのカウンター、つまり、、、およびを維持する2iだけ3jです5k。これらは、の次の番号の候補ですS。それらの1つを選択すると、対応するカウンターのみがインクリメントされ、他の2つはインクリメントされません。そうすることで、すべての倍数を熱心に生成するのではなく、最初のアプローチでスペースの問題を解決します。

n = 8のドライラン、つまり数を見てみましょう91ダイクストラの論文の公理1で述べられているように、私たちはから始めます。

+---------+---+---+---+----+----+----+-------------------+
| #       | i | j | k | 2i | 3j | 5k | S                 |
+---------+---+---+---+----+----+----+-------------------+
| initial | 1 | 1 | 1 | 2  | 3  | 5  | {1}               |
+---------+---+---+---+----+----+----+-------------------+
| 1       | 1 | 1 | 1 | 2  | 3  | 5  | {1,2}             |
+---------+---+---+---+----+----+----+-------------------+
| 2       | 2 | 1 | 1 | 4  | 3  | 5  | {1,2,3}           |
+---------+---+---+---+----+----+----+-------------------+
| 3       | 2 | 2 | 1 | 4  | 6  | 5  | {1,2,3,4}         |
+---------+---+---+---+----+----+----+-------------------+
| 4       | 3 | 2 | 1 | 6  | 6  | 5  | {1,2,3,4,5}       |
+---------+---+---+---+----+----+----+-------------------+
| 5       | 3 | 2 | 2 | 6  | 6  | 10 | {1,2,3,4,5,6}     |
+---------+---+---+---+----+----+----+-------------------+
| 6       | 4 | 2 | 2 | 8  | 6  | 10 | {1,2,3,4,5,6}     |
+---------+---+---+---+----+----+----+-------------------+
| 7       | 4 | 3 | 2 | 8  | 9  | 10 | {1,2,3,4,5,6,8}   |
+---------+---+---+---+----+----+----+-------------------+
| 8       | 5 | 3 | 2 | 10 | 9  | 10 | {1,2,3,4,5,6,8,9} |
+---------+---+---+---+----+----+----+-------------------+

最小候補がすでに追加されているSため、反復6では成長しなかったことに注意してください。6前の要素をすべて覚えておく必要があるというこの問題を回避するために、対応する倍数が最小候補に等しい場合は常にすべてのカウンターをインクリメントするようにアルゴリズムを修正します。これで、次のScala実装が実現します。

def hamming(n: Int): Seq[BigInt] = {
  @tailrec
  def next(x: Int, factor: Int, xs: IndexedSeq[BigInt]): Int = {
    val leq = factor * xs(x) <= xs.last
    if (leq) next(x + 1, factor, xs)
    else x
  }

  @tailrec
  def loop(i: Int, j: Int, k: Int, xs: IndexedSeq[BigInt]): IndexedSeq[BigInt] = {
    if (xs.size < n) {
      val a = next(i, 2, xs)
      val b = next(j, 3, xs)
      val c = next(k, 5, xs)
      val m = Seq(2 * xs(a), 3 * xs(b), 5 * xs(c)).min

      val x = a + (if (2 * xs(a) == m) 1 else 0)
      val y = b + (if (3 * xs(b) == m) 1 else 0)
      val z = c + (if (5 * xs(c) == m) 1 else 0)

      loop(x, y, z, xs :+ m)
    } else xs
  }

  loop(0, 0, 0, IndexedSeq(BigInt(1)))
}
于 2019-02-11T03:49:39.223 に答える
4

基本的に、検索はO(n)で行うことができます。

醜い数字の部分的な履歴を保持していると考えてください。さて、各ステップで次のステップを見つける必要があります。これは、履歴の数値に2、3、または5を掛けたものに等しい必要があります。最小のものを選択して履歴に追加し、リストの最小値に5を掛けた値よりも大きくなるように、いくつかの数値を削除します。最大。

次の番号の検索が簡単になるため、高速になります
。min(最大* 2、最小* 5、中央から1つ* 3)、
これはリスト内の最大番号よりも大きくなります。それらが不足している場合、リストには常に少数の数字が含まれるため、3を掛ける必要のある数字の検索は高速になります。

于 2011-01-05T01:26:23.507 に答える
2

これがMLの正しい解決策です。関数ugly()は、ハミング数のストリーム(遅延リスト)を返します。関数nthは、このストリームで使用できます。

これはSieveメソッドを使用し、次の要素は必要な場合にのみ計算されます。

datatype stream = Item of int * (unit->stream);
fun cons (x,xs) = Item(x, xs);
fun head (Item(i,xf)) = i;
fun tail (Item(i,xf)) = xf();
fun maps f xs = cons(f (head xs), fn()=> maps f (tail xs));

fun nth(s,1)=head(s)
  | nth(s,n)=nth(tail(s),n-1);

fun merge(xs,ys)=if (head xs=head ys) then
                   cons(head xs,fn()=>merge(tail xs,tail ys))
                 else if (head xs<head ys) then
                   cons(head xs,fn()=>merge(tail xs,ys))
                 else
                   cons(head ys,fn()=>merge(xs,tail ys));

fun double n=n*2;
fun triple n=n*3;

fun ij()=
    cons(1,fn()=>
      merge(maps double (ij()),maps triple (ij())));

fun quint n=n*5;

fun ugly()=
    cons(1,fn()=>
      merge((tail (ij())),maps quint (ugly())));

これは最初の年のCS作業でした:-)

于 2011-01-05T01:29:08.777 に答える
2

O(n ^(2/3))でn番目の醜い数を見つけるには、jonderryのアルゴリズムが問題なく機能します。関係する数は膨大であるため、数が醜いかどうかをチェックしようとするアルゴリズムにはチャンスがないことに注意してください。

O(n log n)時間とO(n)スペースの優先度付きキューを使用すると、n個の最小の醜い番号をすべて昇順で簡単に見つけることができます。番号1。次にn回繰り返します。優先キューから最小の番号xを削除します。xが以前に削除されていない場合、xは次に大きい醜い数字であり、2x、3x、および5xを優先キューに追加します。(優先キューという用語を知らない人は、ヒープソートアルゴリズムのヒープのようなものです)。アルゴリズムの開始は次のとおりです。

1 -> 2 3 5
1 2 -> 3 4 5 6 10
1 2 3 -> 4 5 6 6 9 10 15
1 2 3 4 -> 5 6 6 8 9 10 12 15 20
1 2 3 4 5 -> 6 6 8 9 10 10 12 15 15 20 25
1 2 3 4 5 6 -> 6 8 9 10 10 12 12 15 15 18 20 25 30
1 2 3 4 5 6 -> 8 9 10 10 12 12 15 15 18 20 25 30
1 2 3 4 5 6 8 -> 9 10 10 12 12 15 15 16 18 20 24 25 30 40

実行時間の証明:キューから醜い数字をn回抽出します。最初はキューに1つの要素があり、醜い数を抽出した後、3つの要素を追加して、数を2増やします。したがって、醜い数が見つかった後、キューには最大2n+1個の要素があります。要素の抽出は対数時間で実行できます。醜い数字だけでなく、多くてもn個の醜い数字に2n-1個の他の数字(n-1ステップ後にふるいにあった可能性があるもの)を加えた数を抽出します。したがって、合計時間は対数時間= O(n log n)で3n未満のアイテムの削除であり、合計スペースは最大で2n +1要素=O(n)です。

于 2015-08-31T15:48:35.207 に答える
1

動的計画法(DP)を使用して、 n番目の醜い数を計算できると思います。完全な説明はhttp://www.geeksforgeeks.org/ugly-numbers/で見つけることができます

#include <iostream>
#define MAX 1000

using namespace std;

// Find Minimum among three numbers
long int min(long int x, long int y, long int z) {

    if(x<=y) {
        if(x<=z) {
            return x;
        } else {
            return z;
        }
    } else {
        if(y<=z) {
            return y;
        } else {
            return z;
        }
    }   
}


// Actual Method that computes all Ugly Numbers till the required range
long int uglyNumber(int count) {

    long int arr[MAX], val;

    // index of last multiple of 2 --> i2
    // index of last multiple of 3 --> i3
    // index of last multiple of 5 --> i5
    int i2, i3, i5, lastIndex;

    arr[0] = 1;
    i2 = i3 = i5 = 0;
    lastIndex = 1;


    while(lastIndex<=count-1) {

        val = min(2*arr[i2], 3*arr[i3], 5*arr[i5]);

        arr[lastIndex] = val;
        lastIndex++;

        if(val == 2*arr[i2]) {
            i2++;
        }
        if(val == 3*arr[i3]) {
            i3++;
        }
        if(val == 5*arr[i5]) {
            i5++;
        }       
    }

    return arr[lastIndex-1];

}

// Starting point of program
int main() {

    long int num;
    int count;

    cout<<"Which Ugly Number : ";
    cin>>count;

    num = uglyNumber(count);

    cout<<endl<<num;    

    return 0;
}

非常に高速であることがわかります。MAXの値を変更するだけで、より高い醜い数値を計算できます。

于 2014-09-09T22:50:00.580 に答える
1

3つのジェネレーターを並列に使用し、各反復で最小のものを選択します。これは、2128未満のすべての醜い数値を1秒未満で計算するCプログラムです

#include <limits.h>
#include <stdio.h>

#if 0
typedef unsigned long long ugly_t;
#define UGLY_MAX  (~(ugly_t)0)
#else
typedef __uint128_t ugly_t;
#define UGLY_MAX  (~(ugly_t)0)
#endif

int print_ugly(int i, ugly_t u) {
    char buf[64], *p = buf + sizeof(buf);

    *--p = '\0';
    do { *--p = '0' + u % 10; } while ((u /= 10) != 0);
    return printf("%d: %s\n", i, p);
}

int main() {
    int i = 0, n2 = 0, n3 = 0, n5 = 0;
    ugly_t u, ug2 = 1, ug3 = 1, ug5 = 1;
#define UGLY_COUNT  110000
    ugly_t ugly[UGLY_COUNT];

    while (i < UGLY_COUNT) {
        u = ug2;
        if (u > ug3) u = ug3;
        if (u > ug5) u = ug5;
        if (u == UGLY_MAX)
            break;
        ugly[i++] = u;
        print_ugly(i, u);
        if (u == ug2) {
            if (ugly[n2] <= UGLY_MAX / 2)
                ug2 = 2 * ugly[n2++];
            else
                ug2 = UGLY_MAX;
        }
        if (u == ug3) {
            if (ugly[n3] <= UGLY_MAX / 3)
                ug3 = 3 * ugly[n3++];
            else
                ug3 = UGLY_MAX;
        }
        if (u == ug5) {
            if (ugly[n5] <= UGLY_MAX / 5)
                ug5 = 5 * ugly[n5++];
            else
                ug5 = UGLY_MAX;
        }
    }
    return 0;
}

出力の最後の10行は次のとおりです。

100517:338915443777200000000000000000000000000
100518:339129266201729628114355465608000000000
100519:339186548067800934969350553600000000000
100520:339298130282929870605468750000000000000
100521:339467078447341918945312500000000000000
100522:339569540691046437734055936000000000000
100523:339738624000000000000000000000000000000
100524:339952965770562084651663360000000000000
100525:340010386766614455386112000000000000000
100526:340122240000000000000000000000000000000

QuickJSで使用できるJavascriptのバージョンは次のとおりです。

import * as std from "std";

function main() {
    var i = 0, n2 = 0, n3 = 0, n5 = 0;
    var u, ug2 = 1n, ug3 = 1n, ug5 = 1n;
    var ugly = [];

    for (;;) {
        u = ug2;
        if (u > ug3) u = ug3;
        if (u > ug5) u = ug5;
        ugly[i++] = u;
        std.printf("%d: %s\n", i, String(u));
        if (u >= 0x100000000000000000000000000000000n)
            break;
        if (u == ug2)
            ug2 = 2n * ugly[n2++];
        if (u == ug3)
            ug3 = 3n * ugly[n3++];
        if (u == ug5)
            ug5 = 5n * ugly[n5++];
    }
    return 0;
}
main();
于 2020-04-10T16:49:44.873 に答える
0

これが私のコードです。アイデアは、数値を2で割り(余りが0になるまで)、次に3と5で割ることです。ついにその数が1になった場合、それは醜い数です。nまでのすべての醜い数字を数えたり印刷したりすることもできます。

int count = 0;
for (int i = 2; i <= n; i++) {
    int temp = i;
    while (temp % 2 == 0) temp=temp / 2;
    while (temp % 3 == 0) temp=temp / 3;
    while (temp % 5 == 0) temp=temp / 5;
    if (temp == 1) {
        cout << i << endl;
        count++;
    }

}
于 2017-08-11T16:49:05.613 に答える
-3

この問題はO(1)で実行できます。

1を削除し、2から30までの数字を見ると、22の数字があることがわかります。

さて、上記の22の数の任意の数xに対して、31と60の間の数x+30があります。これも醜いです。したがって、31から60までの少なくとも22の数を見つけることができます。31から60までの醜い数ごとに、s + 30と書くことができます。したがって、s + 30は2、3で割り切れるので、sも醜くなります。 、または5。したがって、31から60までの数字は正確に22になります。このロジックは、その後30の数字のブロックごとに繰り返すことができます。

したがって、最初の30個の番号には23個の番号があり、その後は30個ごとに22個の番号があります。つまり、最初の23個の醜いものは1から30の間に発生し、45個の醜いものは1から60の間に発生し、67個の醜いものは1から30の間に発生します。

ここで、n、たとえば137が与えられた場合、137/22=6.22であることがわかります。答えは6*30から7*30の間、または180から210の間です。180までに、180で6 * 22 + 1=133番目の醜い数字になります。210で154番目の醜い数字になります。区間[2、30]の4番目の醜い数(137 = 133 + 4以降)は5です。137番目の醜い数は180 + 5=185になります。

別の例:1500番目の醜い数字が必要な場合は、1500/22=68ブロックを数えます。したがって、30 * 68=2040で22*68 + 1 = 1497番目の醜いものになります。[2、30]ブロックの次の3つの醜いものは、2、3、および4です。したがって、必要な醜いものは2040 +4=です。 2044年。

[2、30]の間の醜い数のリストを作成し、O(1)でルックアップを実行することで答えを見つけることができるということを指摘します。

于 2014-10-02T17:45:21.660 に答える
-3

これは、3つのソートされたリストをマージするというアイデアに基づく別のO(n)アプローチ(Pythonソリューション)です。課題は、次の醜い数字を昇順で見つけることです。たとえば、最初の7つの醜い数字は[1,2,3,4,5,6,8]です。醜い数字は実際には次の3つのリストからのものです。

  • リスト1:1 * 2、2 * 2、3 * 2、4 * 2、5 * 2、6 * 2、8 * 2 ...(それぞれの醜い数字に2を掛ける)
  • リスト2:1 * 3、2 * 3、3 * 3、4 * 3、5 * 3、6 * 3、8 * 3 ...(それぞれの醜い数字に3を掛ける)
  • リスト3:1 * 5、2 * 5、3 * 5、4 * 5、5 * 5、6 * 5、8 * 5 ...(それぞれの醜い数字に5を掛ける)

したがって、n番目の醜い番号は、上記の3つのリストからマージされたリストのn番目の番号です。

1、1 * 2、1 * 3、2 * 2、1 * 5、2 * 3 .. ..

def nthuglynumber(n):
    p2, p3, p5 = 0,0,0
    uglynumber = [1]
    while len(uglynumber) < n:
        ugly2, ugly3, ugly5 = uglynumber[p2]*2, uglynumber[p3]*3, uglynumber[p5]*5
        next = min(ugly2, ugly3, ugly5)
        if next == ugly2: p2 += 1        # multiply each number
        if next == ugly3: p3 += 1        # only once by each
        if next == ugly5: p5 += 1        # of the three factors
        uglynumber += [next]
    return uglynumber[-1]
  1. ステップI:3つのリストから次に考えられる3つの醜い数字を計算する
    • ugly2, ugly3, ugly5 = uglynumber[p2]*2, uglynumber[p3]*3, uglynumber[p5]*5
  2. ステップII、上記の3つの中で最も小さいものとして次の醜い数字を見つけます。
    • next = min(ugly2, ugly3, ugly5)
  3. ステップIII:醜い数字が次の醜い数字だった場合は、ポインターを前方に移動します
    • if next == ugly2: p2+=1
    • if next == ugly3: p3+=1
    • if next == ugly5: p5+=1
    • 注:またはで使用しないifelifelse
  4. ステップIV:マージされたリストに次の醜い番号を追加するuglynumber
    • uglynumber += [next]
于 2015-08-30T18:21:41.830 に答える