leetcode快楽数c++


快楽数
アルゴリズムを作成して、1つの数が「快楽数」であるかどうかを判断します.
「快楽数」は、正の整数に対して、その数を各位置の数値の二乗和に置き換えるたびに、この数が1になるまで繰り返し、無限ループである可能性がありますが、常に1にならないまで繰り返します.1に変えることができれば、この数が快楽数です.
例:
  : 19
  : true
  : 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

解法1:
快楽数ではない数を不快数(unhappy number)と呼び,すべての不快数の数位二乗和計算は,最後に4→16→37→58→89→145→42→20→4のサイクルに入る.
class Solution {
public:
    vector a{ 4,16,37,58,89,145,42,20 };//       
    vector::iterator pos;
    bool isHappy(int n) {
        pos=find(a.begin(),a.end(),n);
        if(pos!=a.end()) return false;//            
        int flag=0;//      
        while(n)
        {
            flag+=pow(n%10,2);
            n/=10;
        }
        if(flag==1)
            return true;
        else return isHappy(flag);//  
    }
};

解法2:
class Solution {
public:
    bool isHappy(int n) {
        string  str;
        int tmp = n;
        for(int i=0;i<6;i++)//      ,        6
        {
            str = to_string(tmp);
            tmp = 0;
            for(auto c : str)
            {
                tmp += (c-'0') * (c-'0');
            }
            if(tmp == 1)
                return true;
        }
        return false;
    }
};