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 条评论
登录 后参与评论

相关文章

来自专栏owent

最长单调子序列 复杂度nlog(n)

701
来自专栏好好学java的技术栈

“365算法每日学计划”:05打卡-图解冒泡排序(多解法)

963
来自专栏数据结构与算法

P3809 【模版】后缀排序

题目背景 这是一道模版题。 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输...

2528
来自专栏数据结构与算法

快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记...

3267
来自专栏分布式系统和大数据处理

正则表达式教程

965
来自专栏Jed的技术阶梯

图解冒泡排序

在上面实现的代码中,即使n个数本来就是有序的,也会进行(n-1)次排序(只比较,不交换) 优化:当数组已经有序后,就中断循环

1113
来自专栏机器学习从入门到成神

2014百度研发真题及其解析-求比指定数大且最小的“不重复数”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

902
来自专栏轮子工厂

一口气吃下数组的存储方式

Long long ago,我们讲到了数组《聊一聊数组背后的那点事》,这个已经是迈进指针的第一步了,主要的内容是一维数组,今天我们将讲述二维数组。当结束了今天的...

601
来自专栏Jack-Cui

Day3、Python

题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1、程序分析     根据题意可知,需要用到字符串的操作方法。本题中要用到的三...

1750
来自专栏desperate633

LintCode A+B问题题目分析代码

给出两个整数a和b, 求他们的和, 但不能使用+等数学运算符。 ** 注意事项 ** ** 你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b...

602

扫码关注云+社区