博客
关于我
热身题A——The 3n + 1 problem
阅读量:201 次
发布时间:2019-02-28

本文共 1538 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要计算给定范围内每个数的循环长度,并找出最大值。我们将利用记忆化技术来优化计算过程,避免重复计算,提高效率。

方法思路

  • 问题分析:给定一个数n,按照特定步骤进行循环,直到得到1。我们需要计算每个数的循环长度,并找出给定范围内最大的循环长度。
  • 记忆化技术:使用一个数组记录每个数的循环长度,避免重复计算,提高效率。
  • 生成数处理:对于每个数k,处理其生成的数(3k+1和2k),预先记录它们的循环长度,进一步优化计算。
  • 解决代码

    #include 
    #include
    using namespace std;
    int find(int n, vector
    & vis, int i, int j) {
    if (n == 1) return 1;
    if (vis[n] != 0) return vis[n];
    vis[n] = 1; // 初始化循环长度为1
    if (n % 2 == 1) {
    int next = 3 * n + 1;
    if (next >= i && next <= j) {
    vis[next] = vis[n] - 1; // 预处理3k+1的长度
    }
    } else {
    int next = 2 * n;
    if (next >= i && next <= j) {
    vis[next] = vis[n] + 1; // 预处理2k的长度
    }
    }
    int cnt = 1;
    while (true) {
    n = (n % 2 == 1) ? 3 * n + 1 : n / 2;
    cnt++;
    if (n == 1) break;
    }
    vis[n] = cnt;
    return cnt;
    }
    int main() {
    vector
    vis(1000001, 0); // vis[i]存储i的循环长度
    int i, j, max_len;
    while (true) {
    cin >> i >> j;
    if (i > j) swap(i, j);
    max_len = 0;
    for (int k = i; k <= j; ++k) {
    if (vis[k] == 0) { // 未计算过
    int len = find(k, vis, i, j);
    if (len > max_len) max_len = len;
    }
    }
    cout << i << ' ' << j << ' ' << max_len << endl;
    }
    }

    代码解释

  • find函数:计算给定数n的循环长度,使用记忆化数组vis记录结果。
  • 预处理生成数:对于每个数k,处理其生成的数(3k+1和2k),预先记录它们的循环长度。
  • 主函数:读取输入,处理每个范围,计算并输出最大循环长度。
  • 通过这种方法,我们可以高效地处理大范围内的查询,避免重复计算,提高了性能。

    转载地址:http://snvi.baihongyu.com/

    你可能感兴趣的文章
    nginx负载均衡和反相代理的配置
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    nginx转发端口时与导致websocket不生效
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置Https证书
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>