【数组基础】Leetcode 202. 快乐数

题目链接

解题思路 

        按照题目描述,如果一个数是快乐数那么很好办,因为不管怎样,经过有限次运算都能得到答案,但是如果该数不是快乐数,那么看起来似乎没有办法自证,因为永远也算不到无限;但是这样的推论忽略了一个条件:快乐数本身的范围是有限的。按照输入数据小于2^{32}的数据规模,估算最大输入max = 2^{2} * 2^{10} * 2^{10}* 2^{10} = 4* 1024 *1024*1024 < 5*10^{9} < 1*10^{10}, 即一个11位数,那么也就是说任何输入最多只有10位,即使这10位都是9,那么通过位数分别平方再求和的运算方法,经过有限次运算后,得到的中间变量x一定满足x <= 9^{2}*10 = 810。根据抽屉原理,在此之后,最多计算810次,就能得到重复的数。而如果出现重复的数且周期里面没有1,那么该数就不是快乐数。

        关键步骤如下:

1.封装计算函数,来对新的中间变量取各位平方之和。

int cal(int n)
{
	int output = 0;
	while(n > 0)
	{
		int temp;
		temp = n % 10;
		output += temp * temp;
		n = n / 10;
	}
	return output;
}

2.创建大小为811的hashset,数据类型为bool。如果中间变量取到temp,那么将hashset[temp]标记为1,如果hashset[temp]已经标记为1且temp != 1,那么说明不是快乐数。

int temp = n;
for(int i = 0; i < 1000; i++)
{
	temp = cal(temp);
	if(temp == 1)
		break;
	if(hashset[temp] == 0)
		hashset[temp] = 1;
	else
		return false;
}
return true;

完整代码

#include <iostream>

using namespace std;

class Solution {
public:

    int cal(int n)//
    {
        int output = 0;
        while(n > 0)
        {
            int temp;
            temp = n % 10;
            output += temp * temp;
            n = n / 10;
        }
        return output;
    }

    bool isHappy(int n)
    {
        bool hashset[811] = {0};//
        int temp = n;
        for(int i = 0; i < 1000; i++)
        {
            temp = cal(temp);
            if(temp == 1)
                break;
            if(hashset[temp] == 0)
                hashset[temp] = 1;
            else
                return false;
        }
        return true;
    }
};

int main()
{
    Solution sol;
    int n = 2;
    bool output = sol.isHappy(n);
    cout << output << endl;
    return 0;
}

  • 18
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy_Xie007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值