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就是,有环,不是快乐数。
}
};
202 肥婆快乐数
最新推荐文章于 2025-05-20 22:15:23 发布