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 @   Kazuma_124  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示