我的编程空间,编程开发者的网络收藏夹
学习永远不晚

3n+1

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

3n+1

// The 3n+1 problem (3n+1 问题)
// PC/UVa IDs: 110101/100, Popularity: A, Success rate: low Level: 1
// Verdict: Accepted
// Submission Date: 2011-05-22
// UVa Run Time: 0.032s
//
// 版权所有(C)2011,邱秋。metaphysis # yeah dot net。
//
// [问题描述]
// 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加
// 1。用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是:
//
// 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
//
// 人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。这个猜想对于至少 1 000 000
// 内的整数都是正确的。
//
// 对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。在上述例子中,22 的循环节长度
// 为 16。输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中,循环节长度的最大
// 值。
//
// [输入]
// 输入每行包含两个整数 i 和 j。所有整数大于 0,小于 1 000 000。
//
// [输出]
// 对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三
// 个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。
//
// [样例输入]
// 1 10
// 100 200
// 201 210
// 900 1000
//
// [样例输出]
// 1 10 20
// 100 200 125
// 201 210 89
// 900 1000 174
//
// [解题方法]
// 计算每个数的循环节长度,求给定区间的最大值。
//
// 需要注意:
// 1. 中间计算过程会超过 int 或 long (如果 int 或 long 型均为 4 字节存储空间) 型数据所能
//    表示的范围,故需要选择 long long (8 字节存储空间)型整数(除非你使用的算法在做乘的时候不
//    使用一般的乘法,而是使用替代方法实现原数的三倍加一)。
// 2. 输入时可能较大的数在前面,需要调整顺序,这个是导致算法正确却 WA 的重要原因。
// 3. 采用填表的方法保存既往计算结果,可以显著减少计算时间。
//
// 从网络上看了许多别人的解题方案,大多数都是忽略了第一点,求循环节长度的过程中,选择了 int 或
// long (按 32 位 CPU 来假定,4 字节存储空间)类型的数据,当计算 (n * 3 + 1) 时会超出 32
// 位整数的表示范围而得到错误答案,只不过 Programming Challenges 和 UVa 上的测试数据不是很强,
// 所以尽管不完善但都会获得 AC。在 1 - 999999 之间共有 41 个数在中间计算过程中会得到大于 32 位
// 无符号整数表示范围的整数,当测试数据包含这些数时,选用 int 或 long 类型有可能会得到错误的答案。
//
// 在中间计算过程中会超过 32 位整数表示范围的整数(括号内为循环节长度):
// 159487(184)  270271(407)  318975(185)  376831(330)  419839(162)
// 420351(242)  459759(214)  626331(509)  655359(292)  656415(292)
// 665215(442)  687871(380)  704511(243)  704623(504)  717695(181)
// 730559(380)  736447(194)  747291(248)  753663(331)  763675(318)
// 780391(331)  807407(176)  822139(344)  829087(194)  833775(357)
// 839679(163)  840703(243)  847871(326)  859135(313)  901119(251)
// 906175(445)  917161(383)  920559(308)  937599(339)  944639(158)
// 945791(238)  974079(383)  975015(321)  983039(290)  984623(290)
// 997823(440)
      
#include <iostream>
      
using namespace std;
#define min(a, b) ((a) <= (b) ? (a) : (b))
#define max(a, b) ((a) >= (b) ? (a) : (b))
#define MAXSIZE 1000000
      
int cache[MAXSIZE];
// 计算循环节长度。
int counter(long long number)
{
    if (number == 1)
        return 1;
      
    // 模 2 计算可用与计算代替,除 2 计算可用右移计算代替。
    if (number & 1)
        number += (number << 1) + 1;
    else
        number >>= 1;
      
    // 若 number 在缓存范围内则根据情况取用。
    if (number < MAXSIZE )
    {
        if (!cache[number])
            cache[number] = counter(number);
        return 1 + cache[number];
    }
      
    return 1 + counter(number);
}
      
int main(int ac, char *av[])
{
    // 对于 GUN C++ 编译器,使用默认参数,在编译时会自动将全局数组 cache 中未初始化
    // 的元素初始化为 0,故可以不需要显式的进行初始化的工作。对于其他编译器应该根据情况调整。
    //
    // memset(cache, 0, sizeof(cache));
    //
    int first, second, start, end;
    while (cin >> first >> second)
    {
        // 得到给定范围的上下界。
        start = min(first, second);
        end = max(first, second);
          
        // 查找最大步长值。
        int result = 0, steps;
        for (int i = start; i <= end; i++)
            if ((steps = counter(i)) > result)
                result = steps;
        // 输出。
        cout << first << " " << second << " " << result << endl;
    }
      
    return 0;
}


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

3n+1

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

3n+1

// The 3n+1 problem (3n+1 问题)// PC/UVa IDs: 110101/100, Popularity: A, Success rate: low Level: 1// Verdict: Accepted//
2023-01-31

如何使用:nth-of-type(3n+1)伪类选择器选择位置符合3n+1条件的同类型元素的CSS样式

如何使用:nth-of-type(3n+1)伪类选择器选择位置符合3n+1条件的同类型元素的CSS样式,需要具体代码示例在CSS中,我们经常需要为特定位置的元素应用不同的样式。:nth-of-type(3n+1)伪类选择器提供了一种方便的方
如何使用:nth-of-type(3n+1)伪类选择器选择位置符合3n+1条件的同类型元素的CSS样式
2023-11-20

求s=1+1(1+2)+1(1+2+3)

求s=1+1/(1+2)+1/(1+2+3)….+1/(1+2+3….+n)的值#include float fun(int n){int i,s1=0;float s=0.0;for(i=1;i<=n;i++){s1=
2023-01-31

C语言计算1/1+1/2+1/3+…+1/n的问题

这篇文章主要介绍了C语言计算1/1+1/2+1/3+…+1/n的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-16
2024-04-02

c语言:求多项式1-1/2+1/3-1/

方法一:for循环实现程序:#includeint main(){double i = 0, t = 0,sum = 0,sign = -1;for (i = 1; i <= 100; i++){sign = -sign;
2023-01-31

php 循环 计算1+1+2+1+2

方法一: for 循环function add($n,$sum=0){    for($i = 1;$i<=$n;$i++){for($j = 1;$j<=$i;$j++){    $sum+=$j;    }}    echo $sum;
2023-01-31

Java循环练习:求1+(1*2)+(1

package practiceGO;public class Cto {public static void main(String[] 
2023-01-31

Java循环练习:求1+(1+2)+(1

package practiceGO;public class Cto {public static void main(Str
2023-01-31

Python------1

封装:把同一功能的放一块。 继承:追根溯源。 类是对象的蓝图和模板,而对象是类的实例。 实例: claddname = Classesname 函数的写法: 如下图所示: 类: 如图所示: 在python中所有的函数
2023-01-31

Python(1)

一、简介:1、Python语法简洁清晰,强制使用空格符作为语句缩进,来分割代码块。      Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。      Python
2023-01-31

python 1

用正则给ip对应的mac分割[root@room1pc01 桌面]# cat  ipmac.txt   192.168.4.5   121212452242   192.168.4.2   242426231251   192.168.4.
2023-01-31

python (1)

1.解释型的,面向对象的,带有动态语义的高级程序设计语言。      2.使用Python    3.Python和c脚本的区别Python脚本  ** #coding:utf-8      设置编码格式c脚本    运行    4.Pyt
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录