100 - The 3n+1 problem (3n+1 问题)

  1. /*
  2. * 100 - The 3n+1 problem (3n+1 问题)
  3. * 作者 仪冰
  4. * QQ 974817955
  5. *
  6. * [问题描述]
  7. * 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,
  8. * 把它乘 3 加1。用新得到的值重复上述步骤,直到 n = 1 时停止。
  9. * 例如,n = 22 时该算法生成的序列是:
  10. * 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
  11. * 人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。
  12. * 这个猜想对于至少 1 000 000 内的整数都是正确的。
  13. * 对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。
  14. * 在上述例子中,22 的循环节长度为 16。
  15. * 输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中,
  16. * 循环节长度的最大值。
  17.  
  18. * [输入]
  19. * 输入每行包含两个整数 i 和 j。所有整数大于 0,小于 1 000 000。
  20. *
  21. * [输出]
  22. * 对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。
  23. * 这三个整数应该用单个空格隔开,且在同一行输出。
  24. * 对于读入的每一组数据,在输出中应位于单独的一行。
  25. *
  26. [样例输入]
  27. 1 10
  28. 100 200
  29. 201 210
  30. 900 1000
  31.  
  32. [样例输出]
  33. 1 10 20
  34. 100 200 125
  35. 201 200 27
  36. 900 1000 174
  37.  
  38. * [解题方法]
  39. * 计算每个数的循环节长度,求给定区间的最大值。
  40. *
  41. * 需要注意:
  42. * 1.中间计算过程有的数据会超出int 或 long 型范围,应该用long long型。
  43. * 2.输入的两个数,应该比较大小,判断出左区间和右区间。
  44. * 3.直接按部就班的计算会time limited(超时),这里采用填表的方法,
  45. * 把算出来的结果保存在一个全局数组中,这样以后用到的时候,直接拿来用,节省时间,避免超时。
  46. */
  47.  
  48. #include<iostream>
  49. #include<cstring>
  50.  
  51. using namespace std;
  52.  
  53. const int MAXN = 1000000; //右端点最大值
  54.  
  55. int MediaVariableArray[MAXN]; //保存区间中所有的循环节长度,这是对填表的应用
  56.  
  57. int LoopNodeLength (long long EveryNumber); //计算循环节长度
  58.  
  59. int main()
  60. {
  61. int firstnumber = 0; //输入的第一个数
  62. int secondnumber = 0; //输入的第二个数
  63. int nodeleft = 0; //区间左端点
  64. int noderight = 0; //区间右端点
  65. int loopnodemax = 0; //保存最大长度的循环节
  66. int everynodelength = 0; //保存区间中单个数的循环节长度
  67.  
  68. memset(MediaVariableArray, 0, sizeof(MediaVariableArray)); //初始化,都置为0
  69.  
  70. while (cin >> firstnumber >> secondnumber)
  71. {
  72. if (firstnumber > secondnumber) //判断左端点和右端点
  73. {
  74. nodeleft = secondnumber;
  75. noderight = firstnumber;
  76. }
  77. else
  78. {
  79. nodeleft = firstnumber;
  80. noderight = secondnumber;
  81. }
  82.  
  83. loopnodemax = 0; //初始化最大值
  84. for (int i=nodeleft; i<=noderight; i++)
  85. {
  86. everynodelength = LoopNodeLength(i);
  87.  
  88. if (everynodelength > loopnodemax) //判断是否更新最大值
  89. {
  90. loopnodemax = everynodelength;
  91. }
  92. }
  93.  
  94. cout << firstnumber << " " <<secondnumber << " ";
  95. cout << loopnodemax << endl;
  96. }
  97.  
  98. return 0;
  99. }
  100.  
  101. int LoopNodeLength(long long EveryNumber)
  102. {
  103. if (EveryNumber == 1)
  104. {
  105. return 1;
  106. }
  107.  
  108. if (EveryNumber & 1) //按位与1 等价于 对2求模;左移 等价于 乘以2,同理右移是除以2。
  109. {
  110. //计算n = 3n + 1;
  111. //左移运算符比加号优先级低,所以加括号;
  112. //我建议不管怎样,为了代码易读都应该加上必要的括号。
  113. EveryNumber = EveryNumber + (EveryNumber<<1) + 1;
  114. }
  115. else
  116. {
  117. EveryNumber >>= 1; //n = n / 2
  118. }
  119.  
  120. //如果中间计算值小于MAXN就看看我们先前求没求出它的循环节长度,
  121. //如果求出来了,直接拿来用,节省时间。
  122. if (EveryNumber < MAXN)
  123. {
  124. if (MediaVariableArray[EveryNumber] == 0)
  125. {
  126. MediaVariableArray[EveryNumber] = LoopNodeLength(EveryNumber);
  127. }
  128.  
  129. return MediaVariableArray[EveryNumber] + 1;
  130. }
  131.  
  132. return LoopNodeLength(EveryNumber) + 1;
  133. }

UVA 100 - The 3n+1 problem (3n+1 问题)的更多相关文章

  1. UVa 100 - The 3n + 1 problem(函数循环长度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  2. 【转】UVa Problem 100 The 3n+1 problem (3n+1 问题)——(离线计算)

    // The 3n+1 problem (3n+1 问题) // PC/UVa IDs: 110101/100, Popularity: A, Success rate: low Level: 1 / ...

  3. PC/UVa 题号: 110101/100 The 3n+1 problem (3n+1 问题)

     The 3n + 1 problem  Background Problems in Computer Science are often classified as belonging to a ...

  4. 100-The 3n + 1 problem

    本文档下载 题目: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pro ...

  5. OpenJudge/Poj 1207 The 3n + 1 problem

    1.链接地址: http://bailian.openjudge.cn/practice/1207/ http://poj.org/problem?id=1207 2.题目: 总时间限制: 1000m ...

  6. The 3n + 1 problem

    The 3n + 1 problem Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  7. poj1207 3n+1 problem

    The 3n + 1 problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 60496   Accepted: 19 ...

  8. 杭电OJ——1032 The 3n + 1 problem

    The 3n + 1 problem Problem Description Problems in Computer Science are often classified as belongin ...

  9. HDU 1032 The 3n + 1 problem (这个题必须写博客)

    The 3n + 1 problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. 集成支付宝SDK遇到的坑

    一.首先我先把集成过程说一下.小编想说的话:支付宝是我做支付中觉得坑最多的一个,各种编译不过,各种出问题. 废话不多说,进入主题:1.首先当前是下载官方SDK啦,当前你也可以通过cocopods进行导 ...

  2. PC-CSS-分隔线

    单个标签实现分隔线: 点此查看实例展示 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: ...

  3. [Unit Testing] Directive testing, require parent controller

    function getCompiledElement() { $scope.chart = { additional: "$ 1.56 / per minute", text: ...

  4. 达到XML简单的动态配置

    今天写的XML相关内容:随着上述眼前的小项目(等级类别)由于地图每个级别.因此,让他动态读取XML内容,这样的变化只能看到XML档. 简单的想法:第一次使用UserDefault类写入文件 UserD ...

  5. html5 video播放不全屏

    <video controls="controls" webkit-playsinline src="${page.videoUrl }" type=&q ...

  6. Java第一周总结(20160801-20160807)

    day01: 1.常见的dos命令:    盘符:            进入指定的盘下面. 操作文件夹:         dir              列出当前控制台所在的路径下的所有文件以及文 ...

  7. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的解决方案

    今天写了一个excel表的导入功能,结果在excel表中的内容导入到页面时报错:SQL  Server 阻止了对组件 'Ad Hoc Distributed Queries' 的  STATEMENT ...

  8. JSON 学习笔记

    学习使用json过程随笔: json数组格式 var employees = [ { "firstName":"Bill" , "lastName&q ...

  9. Thread.sleep(0)的意义& 多线程详解

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...

  10. 关于IIS7.5下的web.config 404 配置的一些问题

    本文介绍一个关于IIS环境下web.config配置的经验问题.在IIS7.5中添加配置404页面时遇到了一些问题,记录如下: 一开始在<customError>下的<error&g ...