【JS】判断快乐数

思路

这里主要是需要熟悉对取值各个位数上的单数操作,也就是数字拆分方法:

  • 转化为字符串,使用split方法
// 将数字转换为字符串,以便拆分为单个数字
let arr = ('' + (totalCount || n)).split('');
  • 使用数学运算符
   let sum = 0; // 初始化 sum 为 0
    while (n) { // 当 n 不为 0 时循环
        sum += (n % 10) ** 2; // 将 n 的最后一位数字平方后加到 sum 上
        n = Math.floor(n / 10); // 去掉 n 的最后一位数字
    }

步骤(方法一)

  1. 初始化:创建一个空的集合(Set),用于存储每个数字的平方和,以检测是否出现循环。

  2. 计算平方和:将给定的数 n 转换为字符串,然后转换回数字数组,计算每个数字的平方和。

  3. 循环检测

    • 使用一个 while 循环,条件是未达到快乐数的终点(即平方和不等于 1)。
    • 在每次循环中,计算当前数字的平方和。
    • 如果计算出的平方和已经存在于集合中,说明已经进入循环,因此该数不是快乐数,返回 false
    • 如果平方和不在集合中,则将其添加到集合中,并更新当前数字为计算出的平方和。
  4. 检查结果:如果平方和达到 1,则该数是快乐数,返回 true

  5. 结束循环:如果循环正常结束(即没有检测到循环且平方和达到 1),则认为数 n 是快乐数。

题目

示例代码

//方法一
var isHappy = function(n) {
    let set = new Set();  // 创建一个Set,用于存储遍历过程中的数字,以便检测循环
    let totalCount;  

    // 开始循环,直到totalCount达到1
    while(totalCount !== 1) {
        // 如果totalCount未定义,则使用n,否则使用totalCount
        // 将数字转换为字符串,以便拆分为单个数字,split返回数组
        let arr = ('' + (totalCount || n)).split('');

        // 使用reduce方法计算数组arr中所有数字平方的和
        // total为累加器,num为当前数字
        // 箭头函数:计算每个数字的平方并累加
        totalCount = arr.reduce((total, num) => total + num ** 2, 0);

        // 如果set中已经存在totalCount,则说明已经出现过这个数字,陷入循环,返回false
        if (set.has(totalCount)) {
            return false;
        }

        // 将当前的totalCount添加到set中,用于下一次循环的检测
        set.add(totalCount);
    }

    // 如果循环正常结束,说明最终totalCount达到1,返回true
    return true;
};

//方法二
// 定义函数 getSum,用于计算一个数各位数字的平方和
var getSum = function (n) {
    let sum = 0; // 初始化 sum 为 0
    while (n) { // 当 n 不为 0 时循环
        sum += (n % 10) ** 2; // 将 n 的最后一位数字平方后加到 sum 上
        n = Math.floor(n / 10); // 去掉 n 的最后一位数字
    }
    return sum; // 返回各位数字的平方和
};

// 定义函数 isHappy,用于判断一个数是否是快乐数
var isHappy = function(n) {
    let set = new Set(); // 创建一个 Set 用于存储遍历过程中的数字,以便检测循环

    // 当 n 不是 1 并且 n 还没有出现在 Set 中时循环
    while (n !== 1 && !set.has(n)) {
        set.add(n); // 将 n 添加到 Set 中
        n = getSum(n); // 用 getSum 函数计算 n 的各位数字的平方和,更新 n 的值
    }

    // 如果 n 等于 1,说明已经找到快乐数,返回 true。否则,说明陷入了循环,返回 false。
    return n === 1;
};

欢迎指正! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值