C++,codewars,Hamming Numbers,525d84b98f428f14a60008da

/*
codewars,Hamming Numbers,525d84b98f428f14a60008da
Hamming数是指其质因子只包含1,3,5的正整数。 即2^i * 3^j * 5^k,其中i,j,k>=0。
要求编写一个函数hamming(n)返回从小到大的第n个Hamming数。
*/

/*
Learn from the solution of others:
*/
#include <iostream>

#include <vector>
#include <cstdint>
uint64_t hamber(int n){
    std::vector<uint64_t> hamming;
    int i=0,j=0,k=0;
    hamming.push_back(1);
    //维护一个vector,记为hamming,按照从小到大的顺序依次加入hamming数
    //每次加入不在hamming中的最小的hamming数
    //i,j,k分别记录在当前hamming中最小的在分别乘以2,3,5后大于hamming.back()的数的位置
    //hamming[i]*2>hamming.back(), hamming[i-1]*2<=hamming.back()
    //hamming[j]*3>hamming.back(), hamming[j-1]*3<=hamming.back()
    //hamming[k]*5>hamming.back(), hamming[k-1]*5<=hamming.back()
    //也就是说, 将hamming中的某个数的某个指数+1,所有大于当前最大值的结果中,
    //最小的数一定在hamming[i]*2,hamming[j]*3,hamming[k]*5中
    //因此hamming的下一个应加入的数是这三个数中的最小值
    while(hamming.size()<n){
        uint64_t min = std::min(hamming[i]*2,std::min(hamming[j]*3,hamming[k]*5));
        hamming.push_back(min);
        //应保证hamming[i]*2,hamming[j]*3,hamming[k]*5 均满足 >hamming.back()
        //在hamming.push_back()后,原来的hamming.back()增大
        //需要更新i,j,k,使得hamming[i]*2,hamming[j]*3,hamming[k]*5 均满足 >hamming.back()
        //这里min==hamming.back()
        if(min==hamming[i]*2)++i;
        if(min==hamming[j]*3)++j;
        if(min==hamming[k]*5)++k;
    }
    return hamming.back();
}

int main(){
    int a;std::cin>>a;
    std::cout<<hamber(a);
}




// /*
// AI解法:
// */
// #include <iostream>
// #include <vector>
// #include <cstdint>
// uint64_t hamber(int n){
//     std::vector<uint64_t> hamming;
//     hamming.push_back(1);
//     int i=0,j=0,k=0;
//     //维护一个vector,记为hamming,按照从小到大的顺序依次加入hamming数
//     //每次加入不在hamming中的最小的hamming数
//     //i,j,k分别记录在当前hamming中最小的在分别乘以2,3,5后大于hamming.back()的数的位置
//     //hamming[i]*2>hamming.back(), hamming[i-1]*2<=hamming.back()
//     //hamming[j]*3>hamming.back(), hamming[j-1]*3<=hamming.back()
//     //hamming[k]*5>hamming.back(), hamming[k-1]*5<=hamming.back()
//     //也就是说, 将hamming中的某个数的某个指数+1,所有大于当前最大值的结果中,
//     //最小的数一定在hamming[i]*2,hamming[j]*3,hamming[k]*5中
//     //因此hamming的下一个应加入的数是这三个数中的最小值
//     while(hamming.size()<n){
//         uint64_t min = std::min(hamming[i]*2,std::min(hamming[j]*3,hamming[k]*5));
//         hamming.push_back(min);
//         if(min==hamming[i]*2) ++i;
//         if(min==hamming[j]*3) ++j;
//         if(min==hamming[k]*5) ++k;
//     }
//     return hamming.back();
// }

//     static std::vector<uint64_t> prime;
//     for(auto& i : prime){
//         if(n%i==0){
//             return false;
//         }
//     }
//     if(n%2!=0 && n%3!=0 && n%5!=0){
//         prime.push_back(n);
//         return false;
//     }else{
//         return true;
//     }
// }
// uint64_t hamber(int n)
// {
//     uint64_t ans = 1;--n;
//     while(n--){
//         ++ans;
//         if(!isHamming(ans)){
//             ++n;
//             continue;
//         }
//     } 
//     return ans;
// }
posted @ 2025-03-02 13:36  Kazuma_124  阅读(13)  评论(0)    收藏  举报