Lintcode快乐数问题解析
来源:互联网 发布:西安软件新城公寓 编辑:程序博客网 时间:2024/06/05 06:17
两种实现:
第一种:
bool isHappy(int n) {
// Write your code here
if (n < 1)
return false;
if (n == 1)
return true;
unordered_set<int> showedNums;
showedNums.insert(n);
while (true) {
int s = 0;
while (n) {
s += (n % 10) * (n % 10);
n = n / 10;
}
//此处如此设计应该包含着这样一层逻辑关系,最后不管是什么数都会陷入无限循环,如果是1的话,就返回TRUE;否则,一直再循环,循环的过程中中间数肯定会重复出现,如果在循环过程中找到了那个中间数,就返回false了。
if (s == 1)
return true;
//如果找到了指定的值,则返回元素的迭代器;如果未在容器中找到,则返回unordered_set :: end。
else if (showedNums.find(s) != showedNums.end())//显然是没找到不进入条件,没找到是end,end=end,不进循环,找到了才进循环呀
return false;
n = s;
showedNums.insert(s);
}
}
第二种:
首先说明一个真命题:任意一个正整数数运用题目中的算法都会循环到1或者89,若循环到1那就是快乐数,若循环到89,就是非快乐数,且循环到这两个数的时候都会陷入死循环。其实对于false情况来说,出现了循环过程中任何一个中间数,那么即可以断定这是一个false的情况了。详情见上一种实现。所以这个题只需要判断题目中的算法最后将给的数循环到了1还是89即可。先写一个sum函数用来拟合题目中的算法,然后再主函数中写一个循环语句,当循环到1或89时停止即可。
int sum(int a){
int temp=a;
int ans=0;
while(temp!=0){
ans+=(temp%10)*(temp%10);
temp/=10;
}
return ans;
}
bool isHappy(int n) {
// write your code here
if(n==1)
return true;
if(n<1)
return false;
int s=n;
while(s!=1&&s!=89){
s=sum(s);
if(s==1)
return true;
if(s==89)
return false;
}
}
- Lintcode快乐数问题解析
- LintCode-简单-快乐数
- LintCode-快乐数
- LintCode:快乐数
- LintCode之快乐数
- lintcode,快乐数
- LintCode 快乐数
- lintcode--快乐数
- LintCode之快乐数
- lintcode:快乐数
- LintCode 488快乐数
- [Lintcode] #488 快乐数
- 快乐数-LintCode
- [LintCode 488] 快乐数 (Python)
- lintcode python代码 488 快乐数
- 快乐数问题
- 快乐数
- 快乐数
- acm练习题——大数阶乘
- 多路视频拼接与三维地图结合
- 算法的时间复杂度和空间复杂度-总结
- caffe通过CMakeLists.txt编译适用于自定义GPU ARCH的动态库
- bzoj3545 [ONTAK2010]Peaks(离线+kruskal+主席树+线段树合并)
- Lintcode快乐数问题解析
- 比KMP算法更简洁,更高效的sunday算法
- SSH2免密码登录OpenSSH
- 网站推荐
- c#天气预报
- TCP的三次握手(建立连接)和四次挥手(关闭连接)
- 命令
- 数据结构实验之图论八:欧拉回路
- 13周,1题:利用Java Swing技术设计一个鼠标点击熟读比赛游戏程序。