488. 快乐数

写一个算法来判断一个数是不是"快乐数"。

一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。 样例 19 就是一个快乐数。

1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

按照题目中说的一共有两种情况,一种情况是一直进行上述操作,然后得到1,要么是无限循环得不到1,那么就按照这个思路,首先while循环判断是否能得到1,然后每一步再判断是否有循环(若有循环,则即是有重复的数,用vector<int>结合find来判断),这样就是可以的: 顺便复习一下std::find函数,在头文件algorithm里。 std::find

template <class InputIterator, class T>
   InputIterator find (InputIterator first, InputIterator last, const T& val);
//接受一对迭代器和一个查找目标,返回一个迭代器,如果没找到返回尾后。
   bool isHappy(int n)
    {
        if(n<=0)   //小于零的话直接返回错误
        return false;
        vector<int> res;
        
        while(n!=1)      //得不到1 的话就一直循环
        {
            int num=0;    //存算出来的数
            while(n>0)
            {
            num+=(n%10)*(n%10);
            n/=10;
            }     //逐位求平方和,从低位往高位求
            
            if(find(res.begin(),res.end(),num)==res.end())   
            //这是std::find接受一堆迭代器和一个目标,是一个模板函数
            {
                res.push_back(num);  //如果没找到,就把这个数放进去
            }
            else
            return false;   //如果能找到的话说明产生循环了,则肯定更不是快乐数
            n=num;
        }
        //n==1了才可能跳出循环,返回true
        return true;
    }

思路二,我一开始也想着算几个数试一下,身边没有笔,就没算,后来一查果然无论是快乐或者不快乐,最后都会归结到1或者4,也就是说,只要是一个整数,一直循环进行这个操作,不是最后得到的不是1就是4,那么这样就简单多了,直接循环,得到1或者4跳出,然后根据是1或者4判断是否是快乐数: code:

  bool isHappy(int n) {
        if(n<=0)
        return false;
        while(n!=1&&n!=4)
        {
            int num=0;
            while(n>0)
            {
            num+=(n%10)*(n%10);
            n/=10;
            }
            n=num;
        }
        return n==1;
        // write your code here
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【编程基础】零基础学习Java之运算符

学习计算机编程语言都会遇到运算符这一知识点,运算符这个知识点是教怎么运用编程语言进行最基本的数据处理,下面就讲一下在Java语言中运算符是怎么回事。 1、算术运...

33110
来自专栏工科狗和生物喵

【计算机本科补全计划】《C++ Primer》:数组全解!!

正文之前 其实我的《C++ Primer》 已经看到第五章了,但是因为码字比较费时间,所以暂时没有迅速更新实在是对不住,但是没办法, 总不能一天拿出五六个小时来...

34010
来自专栏人工智能LeadAI

查找排序数组的最小值(js)

在由小到大已排序的未知数组中,以某个元素为支点旋转(好比将序列沿着前后顺序围成环移动)得到了一个数组,请找出该数组的最小值。比如倘若原数组(对我们而言,并不知道...

1104
来自专栏葡萄城控件技术团队

深入CSS,让网页开发少点“坑”

 通常我们在学习CSS的时候,感觉语法很容易掌握,实际应用中却碰到各式各样难以填补的“坑”,为避免大家受到同样的困惑与不解,本文详细讲解了CSS中优先级和Sta...

1759
来自专栏彭湖湾的编程世界

【算法】哈希表的诞生

《算法(java)》                           — — Robert Sedgewick, Kevin Wayne

1017
来自专栏程序员互动联盟

【编程基础】聊聊C语言-常用运算符

上一篇我们讲了C语言中的基本运算符,他们就像基石一样奠定了我们进行基本算术运算的基础。我们马上将上一篇留得题的答案公布如下: 5/4=1 5.0/4=1.250...

3027
来自专栏小樱的经验随笔

【批处理学习笔记】第二十一课:数值计算

    批处理里面的数值计算功能较弱,只能够进行整型计算,忽略浮点数的小数部分;同时数值计算的范围也受限于系统位数,对于目前较为常见的32位机来说,数值计算能处...

2654
来自专栏C语言及其他语言

运算符和表达式

1.基本运算符 C使用运算符(operator)来代表算术运算。例如,+运算符可以使它两侧的值加在一起。如果您觉得术语“运算符”听起来比较奇怪,那么请您记住...

2253
来自专栏deed博客

day02笔记

1252
来自专栏ACM算法日常

字符串展开(递归)- HDU 1274

常用纱线的品种一般不会超过25种,分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc...

562

扫码关注云+社区