C语言刷题 LeetCode 30天挑战 (二)快慢指针法

Write an algorithm to determine if a number is "happy"

A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of thesquares of its digits,

and repeat the process until the number equals 1 (where it will stay, or it loops endlessly in a cycle which does notinclude 1. Those numbers for which this process ends in 1 are happy numbers.

Input:19

Output:true

Explanation

1^2 + 9^2 = 82

8^2 + 2^2 = 68

6^2 + 8^2 = 100

1^2 + 0^2 + 0^2 = 1

循环检测 是不是在1轮回 快慢指针~

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define DEBUG

int next_n(int n){
    int r=0;
    while(n != 0){
        int d = n % 10;
        n /= 10;
        r += d*d;
    }
    return r;
}

bool contains(int *history,int size,int n){
    for(int i=0; i<size ;++i){
        if(history[i] == n){
            return true;
        }
    }
    return false;
}

bool ishappy(int n){
    int slow=n;
    int fast=n;
    
    do{
        slow = next_n(slow);
        fast = next_n(next_n(fast));
#ifdef DEBUG
        printf("%d %d \n",slow,fast);
#endif
    } while (slow != fast);

    return false;
}

int main()
{
    ishappy(19);
    if(ishappy)
        printf("yes");
    else printf("no");
    return 0;
} 

slow 和 fast 都初始化为输入的数字 n。

slow 每次移动一步,即计算一次数字的平方和;fast 每次移动两步,计算两次平方和。

在循环中,如果 slow == fast,则表示数字进入了循环,不会到达 1。

但是,在这段代码中,无论循环如何执行,最后的结果总是返回 false,这个逻辑需要进一步调整。

相关推荐
码农101号18 分钟前
Linux中容器文件操作和数据卷使用以及目录挂载
linux·运维·服务器
醇醛酸醚酮酯19 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi24 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
PanZonghui36 分钟前
Centos项目部署之Nginx 的安装与卸载
linux·nginx
PanZonghui42 分钟前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
PanZonghui44 分钟前
Centos项目部署之运行SpringBoot打包后的jar文件
linux·spring boot
PanZonghui44 分钟前
Centos项目部署之Java安装与配置
java·linux
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
程序员弘羽1 小时前
Linux进程管理:从基础到实战
linux·运维·服务器
PanZonghui1 小时前
Centos项目部署之常用操作命令
linux