202 肥婆快乐数

class Solution {
public:
 // 2、制作节点的函数
        int makeNode(int x)
        {
            // 定义一个变量,存放各个位上的数的总和
            int sum = 0;

            // 用一个循环来取各个位上的数的平方
            while(x!=0)
            {
                // 先取最后一位x%10,然后求平方和,接着放进总和变量里面
                sum = sum + (x%10)*(x%10);

                // 砍掉最后一位
                x=x/10;
            }

            // 取完了各个位上的数的平方和就返回
            return sum;
        }

    bool isHappy(int n) {

        // 1.首先要明白怎么制作一个结点,就是一个的每一位上的数的平方
        // (1)那么我们要怎么取每一位上面的数,这里有一个办法,就是模运算,取余数,就可以得到最后一位
        
        // (2)那如果这个数是两位数,第一步已经取出了最后一位,那么第一位还没取出来呢,那么我们就除以10去掉最后一位,那么就剩下最高位了。

        // (3)如果这个数是两位数以上呢,那么我们就需要一个循环。第一次取最后一位,砍掉最后一位;第二次取倒数第二位,因为第一次我们已经砍掉了,所以到了这个步骤。原本倒数第二位就是倒数第一位,所以我们就像之前一样取余数就行。其他的位数也一样。

        // (4)所以我们要定义一个变量来存放总数和,那么跳出循环的条件是什么,当传进来的数被砍完,就是取完了所有的位数,用除法来取数,那么最后它会变为0,这个就是跳出循环的条件

       
        // 快慢指针,其实就是慢指针一次制作了一个结点,并且跑到了这个节点上;快指针就是一次制作了两个结点,并且跑到了第二个结点上。其实我们快慢指针制作了结点之后,相当于移动了,就可以判断是否相遇了。

        // 定义快慢指针结点。
        int fast = n; int slow = n ;  // 相当于指向头节点

        do // 制作节点
        {
            fast = makeNode(makeNode(fast));
            slow = makeNode(slow);
        }
        while(fast != slow && fast != 1); // 如果有环或者快指针等于1就跳出循环
        
        if(fast == 1) return true; // 等于1就是快乐数,
       
       return false ;// 不等于1就是,有环,不是快乐数。
    }
  
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值