Пример #1
0
 int nthUglyNumber(int n) {
     if(n <= 0) return 0;
     vector<int> uglys(n, 1);
     int t2 = 0, t3 = 0, t5 = 0, l2 = 2, l3 = 3, l5 = 5;
     
     for(int i = 1; i < n; i++){
         while(l2 <= uglys[i-1]) l2 = uglys[++t2] * 2;
         while(l3 <= uglys[i-1]) l3 = uglys[++t3] * 3;
         while(l5 <= uglys[i-1]) l5 = uglys[++t5] * 5;
         
         if(l2 <= l3 && l2 <= l5) {
             uglys[i] = l2;
             l2 = uglys[++t2] * 2;
         }
         else if(l3 <= l2 && l3 <= l5) {
             uglys[i] = l3;
             l3 = uglys[++t3] * 3;
         }
         else {
             uglys[i] = l5;
             l5 = uglys[++t5] * 5;
         }
     }
     
     return uglys[n-1];
 }
Пример #2
0
 int nthUglyNumber(int n) {
     vector<int> uglys(n);
     //first ugly number
     uglys[0]=1;
     int t2 = 0,t3=0,t5=0;
     for(int i = 1;i<n;i++)
     {
         //choose the minimum ugly number in the next
         uglys[i]= min(uglys[t2]*2,min(uglys[t3]*3,uglys[t5]*5));
         //increase the index
         if(uglys[i]==uglys[t2]*2) t2++;
         if(uglys[i]==uglys[t3]*3) t3++;
         if(uglys[i]==uglys[t5]*5) t5++;
     }
     return uglys[n-1];
 }
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        int k = primes.size();
        vector<int> idxs(k, 0), uglys(n, INT_MAX);
        uglys[0] = 1;

        for (int nth = 1; nth < n; ++nth) {
            for (int idx = 0; idx < k; ++idx) {
                uglys[nth] = min(
                    uglys[nth], primes[idx] * uglys[idxs[idx]]);
            }

            for (int idx = 0; idx < k; ++idx) {
                idxs[idx] +=
                (uglys[nth] == primes[idx] * uglys[idxs[idx]]);
            }
        }

        return uglys.back();
    }
Пример #4
0
 int nthUglyNumberGeneral(int n, vector<int>& factors) {  
   vector<int> uglys(1,1);  
   vector<int> indexes(factors.size(), 0);  
   while(uglys.size() < n) {  
     int min_v = INT_MAX;  
     int min_index = 0;  
     for(int k =0; k< factors.size(); k++) {  
       int temp = uglys[indexes[k]] * factors[k];  
       if(temp < min_v) {  
         min_v = temp;  
         min_index = k;  
       }  
     }  
     indexes[min_index]++;  
     // need to avoid duplicate ugly number  
     if(uglys[uglys.size()-1] != min_v) {  
       uglys.push_back(min_v);  
      }  
   }  
   return uglys[n-1];  
 }