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

/*
* 100 - The 3n+1 problem (3n+1 问题)
* 作者 仪冰
* QQ 974817955
*
* [问题描述]
* 考虑如下的序列生成算法:从整数 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 200 27
900 1000 174 * [解题方法]
* 计算每个数的循环节长度,求给定区间的最大值。
*
* 需要注意:
* 1.中间计算过程有的数据会超出int 或 long 型范围,应该用long long型。
* 2.输入的两个数,应该比较大小,判断出左区间和右区间。
* 3.直接按部就班的计算会time limited(超时),这里采用填表的方法,
* 把算出来的结果保存在一个全局数组中,这样以后用到的时候,直接拿来用,节省时间,避免超时。
*/ #include<iostream>
#include<cstring> using namespace std; const int MAXN = 1000000; //右端点最大值 int MediaVariableArray[MAXN]; //保存区间中所有的循环节长度,这是对填表的应用 int LoopNodeLength (long long EveryNumber); //计算循环节长度 int main()
{
int firstnumber = 0; //输入的第一个数
int secondnumber = 0; //输入的第二个数
int nodeleft = 0; //区间左端点
int noderight = 0; //区间右端点
int loopnodemax = 0; //保存最大长度的循环节
int everynodelength = 0; //保存区间中单个数的循环节长度 memset(MediaVariableArray, 0, sizeof(MediaVariableArray)); //初始化,都置为0 while (cin >> firstnumber >> secondnumber)
{
if (firstnumber > secondnumber) //判断左端点和右端点
{
nodeleft = secondnumber;
noderight = firstnumber;
}
else
{
nodeleft = firstnumber;
noderight = secondnumber;
} loopnodemax = 0; //初始化最大值
for (int i=nodeleft; i<=noderight; i++)
{
everynodelength = LoopNodeLength(i); if (everynodelength > loopnodemax) //判断是否更新最大值
{
loopnodemax = everynodelength;
}
} cout << firstnumber << " " <<secondnumber << " ";
cout << loopnodemax << endl;
} return 0;
} int LoopNodeLength(long long EveryNumber)
{
if (EveryNumber == 1)
{
return 1;
} if (EveryNumber & 1) //按位与1 等价于 对2求模;左移 等价于 乘以2,同理右移是除以2。
{
//计算n = 3n + 1;
//左移运算符比加号优先级低,所以加括号;
//我建议不管怎样,为了代码易读都应该加上必要的括号。
EveryNumber = EveryNumber + (EveryNumber<<1) + 1;
}
else
{
EveryNumber >>= 1; //n = n / 2
} //如果中间计算值小于MAXN就看看我们先前求没求出它的循环节长度,
//如果求出来了,直接拿来用,节省时间。
if (EveryNumber < MAXN)
{
if (MediaVariableArray[EveryNumber] == 0)
{
MediaVariableArray[EveryNumber] = LoopNodeLength(EveryNumber);
} return MediaVariableArray[EveryNumber] + 1;
} return LoopNodeLength(EveryNumber) + 1;
}

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. 【hihocoder 1039 字符串消除】模拟

    题目链接:http://hihocoder.com/problemset/problem/1039 题意:给定一个只由{A, B, C}组成的字符串s,长度为n, 故包含n+1个空隙:现要求在某个空隙 ...

  2. 十分钟搭建自己的hadoop2/CDH4集群

    版本及准备 我部署的是hadoop-2.0.0-cdh4.2.0.tar.gz,下载地址为http://archive.cloudera.com/cdh4/cdh/4/hadoop-2.0.0-cdh ...

  3. 使用 Microsoft.ApplicationBlocks.Data SqlHelper 查询超时以及解决方案

     提示: 后面附有文件,不喜欢看吐槽的,直接到文章结尾下载 摘要:Data Access Application Block 是一个 .NET 组件,包含优化的数据访问代码,可以帮助用户调用存储过程以 ...

  4. 常用Git命令汇总

    常用Git命令汇总 跟着R哥来到了新公司(一个从硬件向互联网转型中的公司),新公司以前的代码基本是使用SVN做版本控制,甚至有些代码没有做版本控制,所以R哥叫HG做了一次Git分享,准备把公司所有的代 ...

  5. nodejs之简介及安装(一)

    @[nodejs|个人学习笔记] nodejs简介 什么是node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. 参考网站 一.nodejs.cn 二 ...

  6. BlockingQueue

    BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html BlockingQueue深入分析 http://blog.cs ...

  7. 插头DP题目泛做(为了对应WYD的课件)

    题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #inc ...

  8. for()循环

    今天发现自己一直以来都搞错了for()循环的执行顺序.这么简单的问题一直都错了,我也是醉了. ;i>&&a[i]>a[i-];--i) { } //即 for(init_s ...

  9. redis学习研究--基础知识

    以下内容多为摘抄转载: 1. Redis 是什么 Redis是一个开源的使用ANSI C语言编写的基于内存的key/value存储系统,与memcache类似,但它支持的value类型更多,包括:字符 ...

  10. vimdiff: 使用Vim中强大的文件diff功能[转]

    学习了一段时间的Vim,直到最近才发现Vim的diff功能是如此方便,对比代码变化再也不用到处去找diff软件或者依靠版本控制的diff了.强大的Vim. 下图是我在macVim中的diff效果. 下 ...