UVa – The 3n + 1 problem 解读

UVa – The 3n + 1 problem 解读

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

这个问题并计算质数了一下相间隔似的。思想上一致。

注意问题:

1 i 可能 大于或等于j — 这里上传。小心阅读题意,我没有说这个地方不能保证。需要特殊处理

2 计算过程中可能溢出,的整数大于最大值,需要使用long long

关于效率和时间问题:

1 能够使用数组保存中间结果,这样执行快了。内存消耗大了,

2 能够不使用中间数组。 这样执行肯定比較慢了。可是内存消耗小,一样能够AC的。

全部没有个标准吧。看情况而定。假设须要速度就添加数组,假设省内存就不使用数组吧。

这样的题目一般都使用数组吧。

我这里使用数组。

參考博客:http://tausiq.wordpress.com/2008/12/09/uva-100-the-3n-1-problem/

题目例如以下:

Background

Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.

The Problem

Consider the following algorithm:

 
		1. 		 input n

2. print n

3. if n = 1 then STOP

4. if n is odd then tex2html_wrap_inline44

5. else tex2html_wrap_inline46

6. GOTO 2

Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)

Given an input n, it is possible to determine the number of numbers printed (including the 1). For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.

For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.

The Input

The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.

You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.

You can assume that no operation overflows a 32-bit integer.

The Output

For each pair of input integers i and j you should output i, j, and the maximum cycle length for integers between and including i and j. These three numbers should be separated by at least one space with all three numbers on one line and with one line of output for each line of input. The integers i and j must appear in the output in the same order in which they appeared in the input and should be followed by the maximum cycle length (on the same line).

Sample Input

1 10
100 200
201 210
900 1000

Sample Output

1 10 20
100 200 125
201 210 89
900 1000 174

注意好上述问题之后就比較好AC了。

我以下程序是写了个类,分开多个函数,能够看的逻辑十分清晰的。当然/2和*2能够改动成>>1和<<1操作。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <stdio.h>

using namespace std;

static int table[1000000] = {0};//={-1}不正常工作。仅仅能清零

class ThreeNOne
{
public:
	const static int MAX_N = 1000000;
	ThreeNOne()
	{
		table[1] = 1;
		for (int i = 2; i < 1000000; i*=2)
		{
			table[i] = table[i/2] + 1;
		}
		initTbl(table);
	}

	int checkTbl(int tbl[], long long i)//i一定要为longlong,int会溢出
	{
		if (i < MAX_N && 0 != tbl[i]) return tbl[i];
		if (i % 2)
		{
			if (i < MAX_N) tbl[i] = checkTbl(tbl, i * 3 + 1) + 1;
			else return checkTbl(tbl, i * 3 + 1) + 1;
		}
		else 
		{
			if (i < MAX_N) tbl[i] = checkTbl(tbl, i / 2) + 1;
			else return checkTbl(tbl, i / 2) + 1;
		}
		return tbl[i];
	}

	void initTbl(int tbl[])
	{
		for (int i = 3; i < 1000000; i++)
		{
			checkTbl(tbl, i);
		}
	}

	void The3n1problem()
	{
		int i = 0, j = 0;
		while (cin>>i>>j)
		{
			pair<int, int> t = minmax(i, j);//区间给定不一定是i<=j的,细致审题
			int ans = 0;
			for (long long d = t.first; d <= t.second; d++)
			{
				ans = max(ans, table[d]);
				//错误:ans += table[d];细致读题,不是和。而是maximum
			}
			cout<<i<<' '<<j<<' '<<ans<<endl;
		}
	}
};

int main()
{
	ThreeNOne tno;
	tno.The3n1problem();
	return 0;
}

版权声明:笔者心脏靖。景空间地址:http://blog.csdn.net/kenden23/。可能不会在未经作者同意转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117377.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vim 3 vimrc[通俗易懂]

    Vim 3 vimrc[通俗易懂]文章目录什么是vimrc基本修改UI相关配置编码相关配置文件相关配置编辑器相关配置按键映射“键我的vimrc小结什么是vimrcvimrc是Vim的配置文件,Vim在启动时会加载vimrc文件,你能想到的几乎所有的配置(包括主题,快捷键,插件设置等等),都可以配置在vimrc中,所以,vimrc在Vim使用过程中有着至关重要的地位.Vim是极…

    2022年5月18日
    46
  • drupal学习教程(待续)「建议收藏」

    drupal学习教程(待续)「建议收藏」1.drupal模块安装a.安装captcha模块–>模块–>用户贡献的模块–>b.启用captcha模块–>模块–>选择–>保存配置c.汉化captcha模块打开https://localize.drupal.org/translate/languages/zh-hans下载captcha汉化包–>配置–>翻译–>导入b.配置capt

    2022年6月12日
    28
  • javascript定义数组,将数组中数组内容求和_数组求和JAVA

    javascript定义数组,将数组中数组内容求和_数组求和JAVA1.应用场景主要用于数组求和 2.学习/操作 TBD 3.问题/补充 TBD 4.参考 https://blog.csdn.net/weixin_40687883/article/details/85248195 https://www.jb51.net/article/154559.htm 后续补充……

    2022年10月2日
    4
  • 秒秒钟解决打开ps图片显示无法完成请求,因为程序错误「建议收藏」

    秒秒钟解决打开ps图片显示无法完成请求,因为程序错误「建议收藏」问题描述今天在做ps作业的时候做到一半,保存的时候卡了一下,我等了一会,不卡了,我以为我保存了就没什么事了,然后就关闭ps,软件关闭的时候也卡了一下,结果现在想接着做的时候打不开了,做了那么久那么多图层都在,我心态直接崩了,白做了。当我赶紧上网查怎么修复和解决。全特码是p话,一个有用的都没有,说什么右键ps属性,兼容性的运行,管理员打开,设置好后就可以直接打开了,我特么又不是兼容性的问题,之前一直用的好好的,还有打开ps清理暂存盘,缓存大小改大,我。。。。。。呵呵。还有说检查ps是否更新了,说什么确保系.

    2025年5月25日
    2
  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

    2022年6月16日
    83
  • WinHTTP Web Proxy Auto-Discovery Service 服务处于 停止 状态「建议收藏」

    WinHTTP Web Proxy Auto-Discovery Service 服务处于 停止 状态「建议收藏」WinHTTPWebProxyAuto-DiscoveryService服务处于停止状态还有,我的服务器没有使用WEB代理和防火墙客户端。但是有一天早上来发现全部电脑都无法上网。PINGISA都不通。重新启动后正常。我检查系统日志里面有3条关于WEB代理的日志:1。TheWinHTTPWebProxyAuto-DiscoveryServicehas…

    2022年6月21日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号