C解法

如果当前数字是偶数,可以将其除以 2。
如果当前数字是奇数,可以加 1 或减 1。
由于问题的目标是求最小步数,这个问题适合使用 广度优先搜索(BFS) 来解决。BFS 能够保证找到从 n 到 1 的最短路径,因为它会按层次遍历所有可能的状态,确保我们在找到 1 时,是通过最少的步骤到达的。

BFS 思路
队列:使用队列来维护当前的状态,每个队列元素包含两个信息:当前数字和到达该数字的步数。
集合:为了防止重复计算,使用一个集合(或者类似的机制)来记录已经访问过的数字。
初始状态:将初始数字 n 和步数 0 入队。
状态转移:对于当前数字:
如果是偶数,将其除以 2 并入队。
如果是奇数,尝试加 1 或减 1,并将结果入队。
终止条件:一旦队列中出现 1,返回当前的步数

#include 
#include 
#include 

#define QUEUE_SIZE 1000000  // 定义队列的最大容量

// 状态结构体,保存当前数字和步数
typedef struct {
    long long num;  // 当前数字
    int steps;      // 当前步数
} State;

// 队列结构体
typedef struct {
    State data[QUEUE_SIZE];  // 存储队列中的元素
    int front;  // 队列头部
    int rear;   // 队列尾部
} Queue;

// 入队操作
void enqueue(Queue* q, State value) {
    if ((q->rear + 1) % QUEUE_SIZE == q->front) {
        // 如果队列已满,返回
        return;
    }
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % QUEUE_SIZE;  // 环形队列,尾部后移
}

// 出队操作
State dequeue(Queue* q) {
    State value = q->data[q->front];
    q->front = (q->front + 1) % QUEUE_SIZE;  // 环形队列,头部后移
    return value;
}

// 判断队列是否为空
int is_empty(Queue* q) {
    return q->front == q->rear;  // 队列为空时,头尾相等
}

int main() {
    long long num;
    // 读取输入的数字
    scanf("%lld", &num);

    // 如果输入是 1,直接返回 0 步
    if (num == 1) {
        printf("0\n");
        return 0;
    }

    // 初始化队列
    Queue q = { .front = 0, .rear = 0 };

    // 将初始状态(数字 num 和步数 0)入队
    enqueue(&q, (State) { num, 0 });

    // BFS 循环
    while (!is_empty(&q)) {
        // 出队,获取当前状态
        State current = dequeue(&q);

        long long n = current.num;  // 当前数字
        int steps = current.steps;  // 当前步数

        // 如果当前数字是 1,输出步数并返回
        if (n == 1) {
            printf("%d\n", steps);
            return 0;
        }

        // 如果当前数字是偶数,可以选择除以 2
        if (n % 2 == 0) {
            enqueue(&q, (State) { n / 2, steps + 1 });
        }
        else {
            // 如果是奇数,可以选择加 1 或减 1
            enqueue(&q, (State) { n + 1, steps + 1 });
            enqueue(&q, (State) { n - 1, steps + 1 });
        }
    }

    return 0;  // 理论上不会到达这里
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145099647"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!