Esempio n. 1
0
    public int NthSuperUglyNumber(int n, int[] primes)
    {
        if(n == 1){ return 1; }
        if(primes == null || !primes.Any()){ return 1;}
        if(primes.Length == 1){ return (int)Math.Pow(primes[0],(n-1)); }

        var uglies = new int[n];
        uglies[0] = 1;
        var c = 1;

        var poss  = new Possibilities(primes);

        while(c < n){
            var m = poss.GetMin();
            var prime = m.GetPrime(uglies);
            var index = m.UglyIndex;
            var possibility = m.Value;

            if(possibility != uglies[c-1]){
                uglies[c++] = possibility;
            }

            poss.Set(prime,index+1, uglies[index+1] * prime);
        }

        return uglies.Last();
    }
Esempio n. 2
0
    public int NthSuperUglyNumber(int n, int[] primes)
    {
        if(n == 1){ return 1; }
        if(primes == null || !primes.Any()){ return 1;}
        if(primes.Length == 1){ return (int)Math.Pow(primes[0],(n-1)); }

        var uglies = new int[n];
        uglies[0] = 1;
        var c = 1;

        var poss  = new Possibilities(primes);

        while(c < n){
            List<int> prs;
            uglies[c++] = poss.GetMin(out prs);

            foreach(var p in prs){
                var i = poss.Get(p);
                poss.Set(p,i+1, uglies[i+1] * p);
            }
            //Console.WriteLine(poss.ToString());
        }

        //Console.WriteLine(String.Join(",", uglies));
        return uglies.Last();
    }